Open henryliangt opened 2 years ago
ARRAY operation https://blog.csdn.net/leshami/article/details/55192965
https://www.cnblogs.com/xuliuzai/p/10331524.html
https://juejin.cn/post/6917520923784380424
db.test_collection.aggregate([ { $group: { // 这里的写法有很多。单个属性分组 "_id": "$rank" // 多个:"_id": ["$rank", "$age"] // 或者 "_id": {"rank": "$rank", "age": "$age"} "_id": ["$rank", "$age"], // 对于相同的分组去唯一的一个值可以用 $first, $last, $max, $mix,看心情 "name": {$first: '$name'}, "rank": {$first: "$rank"}, "age": {$first: "$age"}, count: {$sum: 1} // 统计每个分组的数量 } } ])
db.test_collection.aggregate([ { $group: { "_id": ["$rank"], "name": {$first: '$name'}, "rank": { $push: { // 可以用 $addToSet 代替,保证插入元素的不重复 "rank": "$rank", "age": "$age" } }, "age": {$first: "$age"} } } ])
// mongodb 默认显示所有字段,当你显式的声明某个字段应该显示即 "age": 1 抛弃了其他未声明为 'true' 的字段(但是_id)需要显示的声明不显示 // 反之显式的声明某个字段不显示不影响其他字段显示不显示。 db.test_collection.aggregate([ { $project: { "_id": 0, "age": 1, "newAge": "$age", // 重命名 "newField": "我是手动新增字段" // 手动增加一个字段 } } ])
// if else 支持 db.inventory.aggregate([ { $project: { item: 1, discount: { $cond: { if: { $gte: [ "$qty", 250 ] }, then: 30, else: 20 } } } } ])
// case when 支持 db.grades.aggregate([ { $project: { "name": 1, "summary": { $switch: { branches: [ { case: {$gte: [{$avg: "$scores"}, 90]}, then: "Doing great!" }, { case: {$and : [{$gte: [{$avg: "$scores"}, 80]}, {$lt: [{$avg: "$scores"}, 90]}]}, then: "Doing pretty well." }, { case: {$lt: [{$avg : "$scores"}, 80]}, then: "Needs improvement." } ], default: "No scores found." } } } } ])
mysql 中的 group_concat
mysql 中的 group_concat 应该怎么实现,包括 distinct orderBy? 在$group阶段用$push/$addToSet可以把用一个组某个属性值都存在一个数组中。然后 $reduce 会应用于数组中每个元素并压缩成一个值。 $indexOfArray:判断内嵌文档对象在数组中的下标位置。 $reverseArray:反转数组中的顺序。如果只是单纯的想对数组内嵌文档排序,推荐用updateOne()方法,$push 一个[]空数组并运用其中的$sort方法即可对数组内嵌文档排序。实现查询出的数组内嵌文档按指定排序输出。即查询前先执行一条 push 空数组命令对数组内容排序,然后执行 find 语句 $map:和$reduce对应的就是$map,并不会压缩对象,而是会遍历每个数组内嵌文档。对内嵌文档做一些增减操作。
{
$reduce: {
input:
}
}
])
// 结果如下
//{
// "_id" : ObjectId("5f92760d1e17044b8df04955"),
// "racesList" : "均衡寺院,帕拉斯神庙,希拉娜修道院"
//}
滤掉部分数组内嵌文档
当你想改这个东西的时候即你显示的声明了想要显示这个字段,你还需要显示的声明其他本不需要显示声明的字段。例如:你必须强制的把所有想要显示的字段全部显示一遍,对字段很多的 vo 简直是噩梦。 这时可以试试这个管道操作:$addFields,只单纯的增加字段,并不会影响原先的映射字段。
我查出来了一条文档,有一个属性是数组内嵌文档,怎么过滤掉部分数组内嵌文档即{"race.name": "均衡寺院"}
有且仅返回一条符合匹配条件的数组内嵌文档 $elemMatch。在 findOne(query, project) 中的 project
// findOne(query, project) 中 仅返回被匹配的第一条。其属性还是数组内嵌文档 db.test_collection.findOne( {"countryName" : "艾欧尼亚"}, { "countryName": 1, "introduction": 1, "description": 1, "area": 1, "createAt": 1, "races": {$elemMatch: {"name": "均衡寺院"}} // 就是因为这个,导致上面的都必须显示的声明出来。字段一多就特别麻烦 } )
// 按照匹配条件匹配一条至多条。其属性还是数组内嵌文档 db.test_collection.aggregate([ { $match: {"countryName": "艾欧尼亚"} }, { "countryName": 1, "introduction": 1, "description": 1, "area": 1, "createAt": 1, $project: { "races": { $filter: { input: "$races", as: "item", cond: { $eq: ["$$item.name", "均衡寺院"] // 注意这里不是大括号而是中括号 } } } } } ])
db.test_collection.aggregate([ { $match: {"countryName": "艾欧尼亚"} }, {$unwind: "$races"}, { $match: {"races.name": "均衡寺院"} } ])
https://www.jianshu.com/p/f191478edce8
当find有多个条件时,如果字段是普通字段就是and的关系; 当find有多个条件时,如果是数组字段就是 or 的关系;想要数组字段达到and的效果,需要使用$elemMatch 数组字段的操作符 $all, 参数是指定子集,作用是找出 所有包含这个子集的数组字段的文档 MongoDB 本身没有提供 allMatch, 需要自行实现,思路是 双重否定 配合 排除干扰项
https://blog.csdn.net/rgc_520_zyl/article/details/120655266
https://blog.csdn.net/li1325169021/article/details/124599154
https://www.cnblogs.com/duanxz/p/3768253.html
https://www.cnblogs.com/duanxz/p/3746122.html
https://www.tizi365.com/topic/81.html
https://m.haicoder.net//mongodb/mongodb-index-explain.html
https://juejin.cn/post/7102250055666663460
https://studio3t.com/knowledge-base/articles/mongodb-explain-visualized/
https://juejin.cn/post/6917520923784380424
Cooper Peddy Lightening Ridge.