mongodb的管道查询 fangfu的技术博客

各种常用管道操作符的功能描述: $project:修改文档的结构(重命名、增加或删除域),也可以用于创建计算结果以及嵌套文档。 $match:过滤数据,只输出符合条件的文档。 $limit:限制MongoDB聚合管道返回的文档数。 $skip:在聚合管道中跳过指定数量的文档。 $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。 $group:将集合中的文档分组,可用于统计结果。 $sort:文档排序输出。 $geoNear:输出接近某一地理位置的有序文档。

$lt: < $lte: <= $gt: > $gte: >=

$match match可以对文档进行筛选,类似于指定某个条件进行查询 通常我们都把match放在管道的前面,这样可以相对减少管道后面的计算量 db.user_nearby.aggregate({$match:{userId:”1749”}})

$project project用于提取某一个或多个特定的字段,也可以屏蔽显示某一个或多个字段 只提取userId字段,默认会包含_id字段: db.user_nearby.aggregate({$project:{userId:1}}) 如果不需要_id字段,则把_id设为0,1表示显示这个字段,0表示不显示: db.user_nearby.aggregate({$project:{userId:1,_id:0}}) 对userId字段进行重命名,重命名后,字段对应索引将会失效 db.user_nearby.aggregate({$project:{“usernew”:”$userId”,_id:0}})

$project还可以集合运算符,进行数学表达式的计算。 数学表达式 $add add可以对字段进行相加,只适用于数字类型,total这儿可以自定义,只是一个名字 db.num.aggregate({$project:{total:{$add:[“$x”,”$y”,”z”]}}})

$subtract 比较字段大小,对字段做减法,可以减成负数.只能对两个字段进行操作 db.num.aggregate({$project:{total:{$subtract:[“$y”,”$z”]}}})

$multiply 乘积运算,可以对多个字段进行运算 db.num.aggregate({$project:{result:{$multiply:[“$x”,”$y”,”$z”]}}})

$divide 除法运算,第一个除以第二个,只接受两个参数 db.add.aggregate({$project:{result:{$divide:[“$x”,”$y”]}}})

$mod 取模运算,也叫求余运算,只能对两个字段进行操作 db.num.aggregate({$project:{result:{$mod:[“$x”,”$y”]}}})

db.groups.aggregate({$project:{_id:0,result:{$divide:[“$validTime”,10000000]}}})

db.groups.aggregate([{$match:{“validTime”:{$ne:null}}},{$project:{result:{$divide:[“$validTime”,10000000]}}}])

联表查询的两个例子,注意通过project控制选择输出字段,不然数据大了很容易卡爆 db.group_members.aggregate([{$lookup:{from:”groups”,localField:”groupId”,foreignField:”_id”,as:”groups”}}, {$match:{“role”:{$in:[0,1]},”groups”:{$elemMatch:{“lvl”:{“$gt”:0}}} }}, {$project:{_id:0,userId:1,groupId:1,role:1,nickname:1,number:1,groups:1}}])

db.groups.aggregate([{$lookup:{from:”group_members”,localField:”_id”,foreignField:”groupId”,as:”group_members”}}, {$match:{“lvl”:{“$gt”:0},”group_members”:{$elemMatch:{“role”:1}} }}, {$project:{name:1,lvl:1}}])

说明一下: localField 本地字段,localField远程字段,意思就是本地的这个表的字段与远程的表的特定字段相关联。 $match提供查询条件,这里是两个查询条件,用逗号分隔 $project提取字段,全部字段都输出可能会卡

(1)管道的是具有先后顺序的。 (2)$group操作目前是在内存中处理的,因此,不能对大量的文档进行使用该种方式进行分组操作; (3)使用$unwind对数组中的字段值进行拆分时需要注意不能忘记写$符号,如{$unwind:”$tags”},tags字段前面有个$号; (4)MongoDB 24.对内存做了优化,如果$sort出现在$limit之前,$sort只会对前$limit个文档进行操作,在内存中也只会保留前$limit个文档,节省了内存 (5)$sort操作是在内存中进行的,如果其占有的内存超过物理内存的10%,程序会产生错误 (6)管道的输出结果大小不能大于16M,超过会出现错误。 (7)如果一个管道操作符在执行过程中所占用的内存超过系统内存容量的10%,则会报错; (8)聚合管道可以提供很好的性能和一致的接口,使用起来比较简单,对于一些简单的固定的聚集操作可以使用管道,但是对于一些复杂的、大量数据集的聚合任务还是使用MapReduce。

管道查询的相关链接: https://blog.csdn.net/u012702547/article/details/81874130

FFwechat FFalipay