Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/462.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript mongodb聚合筛选器和节点上的计数_Javascript_Node.js_Mongodb_Aggregation Framework_Mongodb Aggregation - Fatal编程技术网

Javascript mongodb聚合筛选器和节点上的计数

Javascript mongodb聚合筛选器和节点上的计数,javascript,node.js,mongodb,aggregation-framework,mongodb-aggregation,Javascript,Node.js,Mongodb,Aggregation Framework,Mongodb Aggregation,我把这个集合命名为“点” 我还有另一个名字叫“小溪” 我需要在我想要搜索包含字母“o”的电子邮件的地方进行聚合查询。我期望的结果是这样的 [ { 'guid': 'aaa', items: 2 }, { 'guid': 'bbb', item: 1 }, { 'guid': 'ccc', item: 0 }, ] 我已经这样做了 db.getCollection('points').aggregate([ { $lookup: {

我把这个集合命名为“点”

我还有另一个名字叫“小溪”

我需要在我想要搜索包含字母“o”的
电子邮件的地方进行聚合查询。我期望的结果是这样的

[
    { '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

答案是根据评论编辑的

您可以尝试以下聚合管道

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。

做得好,但如果需要,请从流中选择count(*),其中guid=stream.guid和(stream.email,如“%o%”或stream.email,如“%I%”)thanks@MauroSala:更新了我的答案。但是您的所有电子邮件在“disney”中都有“i”…我需要用很多这样的内容进行查询:从流中选择COUNT(*),其中guid=stream.guid和(stream.email如“%o%”或stream.title如“%i%”,但您的答案是正确的
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" }