mongodb聚合filter并计算nodejs
我有这个集合命名为“点”
[ { 'guid': 'aaa' }, { 'guid': 'bbb' }, { 'guid': 'ccc' }, ]
我有另一个名为“stream”
[ { 'title': 'pippo', 'guid': 'aaa', 'email': 'pippo@disney'}, { 'title': 'pluto', 'guid': 'aaa', 'email': 'pluto@disney'}, { 'title': 'goofy', 'guid': 'bbb', 'email': 'goofy@disney'}, { 'title': 'duck', 'guid': 'aaa', 'email': 'duck@disney'}, { 'title': 'minnie', 'guid': 'ccc', 'email': 'minnie@disney'}, ]
我需要做一个聚合查询,我要search包含字母“o”的email
。 我期望的结果是这样的
[ { 'guid': 'aaa', items: 2 }, { 'guid': 'bbb', item: 1 }, { 'guid': 'ccc', item: 0 }, ]
我已经这样做了
db.getCollection('points').aggregate([ { $lookup: { from: "stream", localField: "guid", foreignField: "guid", as: "items" } }, { $project: { _id: 0, guid: 1, items: { $size: "$items" } } } ]);
如果我在MySQL中,查询将是这个
SELECT DISTINCT points.guid, ( SELECT COUNT(*) FROM stream WHERE guid = stream.guid and stream.email like '%o%' ) AS items FROM points
答案是根据评论编辑的。
您可以尝试以下聚合pipe道。
db.getCollection("points").aggregate([ {"$lookup":{"from":"stream", "localField":"guid", "foreignField":"guid", as:"items"}}, {"$unwind":"$items"}, {"$group":{"_id": "$guid", "guid":{"$first":"$guid"}, "emails":{"$push":"$items.email"}}}, {"$project":{"guid" :1, "emails":{"$setUnion":["$emails", [{"$literal":"io"}]]}}}, {"$unwind":"$emails"}, {"$match":{"emails":/[io]/}}, {"$group":{"_id":"$guid", "items":{"$sum":1}}}, {"$project":{"_id":0, "guid":"$_id", "items":{"$add":["$items", -1]}}} ])
示例输出:
{ "items" : 3, "guid" : "aaa" } { "items" : 1, "guid" : "ccc" } { "items" : 1, "guid" : "bbb" }
注意:我已经引入了一个虚拟的电子邮件id – 'oi',它满足匹配条件,确保点集合中的数据不会丢失。 为了补偿这个虚拟域,最后从计数中减去-1。