henryliangt / mongodb

0 stars 0 forks source link

Performance Test #7

Open henryliangt opened 2 years ago

henryliangt commented 2 years ago

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.

henryliangt commented 2 years ago

CODE style in latex

https://www.overleaf.com/learn/latex/Code_listing#Supported_languages

https://tex.stackexchange.com/questions/83085/how-to-improve-listings-display-of-json-files

henryliangt commented 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." } } } } ])

henryliangt commented 2 years ago

mysql 中的 group_concat

mysql 中的 group_concat 应该怎么实现,包括 distinct orderBy? 在$group阶段用$push/$addToSet可以把用一个组某个属性值都存在一个数组中。然后 $reduce 会应用于数组中每个元素并压缩成一个值。 $indexOfArray:判断内嵌文档对象在数组中的下标位置。 $reverseArray:反转数组中的顺序。如果只是单纯的想对数组内嵌文档排序,推荐用updateOne()方法,$push 一个[]空数组并运用其中的$sort方法即可对数组内嵌文档排序。实现查询出的数组内嵌文档按指定排序输出。即查询前先执行一条 push 空数组命令对数组内容排序,然后执行 find 语句 $map:和$reduce对应的就是$map,并不会压缩对象,而是会遍历每个数组内嵌文档。对内嵌文档做一些增减操作。

{ $reduce: { input: , // [1, 2, 3] 或者数组属性值 "$var" initialValue: , // 这个初始值只能被应用到一次 in: // 做一些操作 } } // 完成 group_concat 中字符串拼接并且 orderBy db.test_collection.aggregate([ {$match: {"countryName" : "艾欧尼亚"}}, { $sort: { "orderBy": 1 // 实现 group_concat 中 orderBy 的功能 } }, { $project: { "racesList": { $reduce: { input: {$reverseArray: "$races"}, // 反转数组顺序,至于为什么这里需要反转顺序,可以实测一番mongodb读取数组内容下标从 0 开始还是 length -1 开始 initialValue: "", in: { $cond: { // if else 支持 if: {$eq: [{$indexOfArray: ["$races", "$$this"]}, NumberInt(0)]}, then: {$concat: ["", "$$this.name", "$$value"]}, // 不知道为啥,这个 "$$value" 好像必须要出现。不然达不到效果 else: {$concat: [",", "$$this.name", "$$value"]} } } } }
} } ]) // 结果如下 //{ // "_id" : ObjectId("5f92760d1e17044b8df04955"), // "racesList" : "均衡寺院,帕拉斯神庙,希拉娜修道院" //}

henryliangt commented 2 years ago

滤掉部分数组内嵌文档

当你想改这个东西的时候即你显示的声明了想要显示这个字段,你还需要显示的声明其他本不需要显示声明的字段。例如:你必须强制的把所有想要显示的字段全部显示一遍,对字段很多的 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": "均衡寺院"}} // 就是因为这个,导致上面的都必须显示的声明出来。字段一多就特别麻烦 } )

henryliangt commented 2 years ago
  1. 按照匹配条件匹配一条至多条 $filter

// 按照匹配条件匹配一条至多条。其属性还是数组内嵌文档 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", "均衡寺院"] // 注意这里不是大括号而是中括号 } } } } } ])

henryliangt commented 2 years ago
  1. 将属性值为数组内嵌文档变成内嵌文档 $unwind

db.test_collection.aggregate([ { $match: {"countryName": "艾欧尼亚"} }, {$unwind: "$races"}, { $match: {"races.name": "均衡寺院"} } ])

henryliangt commented 2 years ago

https://www.jianshu.com/p/f191478edce8

当find有多个条件时,如果字段是普通字段就是and的关系; 当find有多个条件时,如果是数组字段就是 or 的关系;想要数组字段达到and的效果,需要使用$elemMatch 数组字段的操作符 $all, 参数是指定子集,作用是找出 所有包含这个子集的数组字段的文档 MongoDB 本身没有提供 allMatch, 需要自行实现,思路是 双重否定 配合 排除干扰项

henryliangt commented 2 years ago

https://www.jianshu.com/p/9adf30a71fc3

https://www.mongodb.com/docs/manual/reference/aggregation-variables/

https://www.mongodb.com/docs/manual/reference/operator/aggregation/addFields/#mongodb-pipeline-pipe.-addFields

https://www.mongodb.com/docs/v4.2/reference/operator/aggregation/#array-expression-operators

https://www.mongodb.com/docs/manual/reference/operator/aggregation/arrayElemAt/