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。