Mongodb如何获得两个聚合查询的OR?

时间:2018-02-13 11:30:51

标签: mongodb mongodb-query aggregation-framework

我正在使用以下聚合查询来获取结果(比如query1):

db.fb.aggregate(
    [
     {
        $addFields : { noOfLikes : { $sum : { $map : { input : "$facebookEvents", as : "f", in : {$cond : [ { $eq : ["$$f.type" , "like"] }, 1, 0 ]} }}}}
      },
      {
        $match : {"noOfLikes" : {$gte : 2}}
      }
    ]
)

和另一个获得其他结果的查询(比方说query2):

db.fb.aggregate(
    [
    { $match : { author : "dave" } },
    { $match : { test : "test1" } }
    ]
)

是否可以使用单个query1查询获取query2aggregate?换句话说,我希望使用单个查询获得与query1query2匹配的结果。感谢任何帮助

mongo版本:3.4.4

2 个答案:

答案 0 :(得分:0)

在单个聚合查询中,您需要按如下方式运行管道:

db.fb.aggregate([
    {
        "$addFields": { 
            "noOfLikes": { 
                "$sum" : { 
                    "$map": { 
                        "input": "$facebookEvents", 
                        "as": "f", 
                        "in": {
                            "$cond": [{ "$eq": ["$$f.type" , "like"] }, 1, 0 ]
                        } 
                    }
                }
            }
        }
    },
    {
        "$match" : {
            "$or": [
                { "noOfLikes" : { "$gte" : 2 } },
                { "author": "dave", "test": "test1" }
            ]
        }
    }
])

或使用 $redact 作为:

db.fb.aggregate([
    { 
        "$redact": { 
            "$cond": [
                { 
                    "$or": [  
                        { "$gte": [ 
                            {                                   
                                "$sum" : { 
                                    "$map": { 
                                        "input": "$facebookEvents", 
                                        "as": "f", 
                                        "in": {
                                            "$cond": [
                                                { "$eq": ["$$f.type" , "like"] }, 
                                                1, 
                                                0 
                                            ]
                                        } 
                                    }
                                }
                            }, 2 ]
                        },
                        {                               
                            "$and": [ 
                                { "$eq": ["$author", "dave"] },
                                { "$eq": ["$test", "test1"] }
                            ]
                        }
                    ]
                },
                "$$KEEP",
                "$$PRUNE"
            ]
        }
    }
])

答案 1 :(得分:0)

您可以使用$facet

db.fb.aggregate(
{
    $facet : {
        byLikes : [ 
            { $addFields : { noOfLikes : { $sum : { $map : { input : "$facebookEvents", as : "f", in : {$cond : [ { $eq : ["$$f.type" , "like"] }, 1, 0 ]} }}}} }, 
            { $match : {"noOfLikes" : {$gte : 2}}} 
       ],
        byAuthor : [ 
            { $match : { author : "dave" } }, 
            { $match : { test : "test1" } }     
        ]
    }
}
)