如何使用MongoDB聚合基于$和/ $或?

时间:2016-01-26 16:43:08

标签: mongodb mongodb-query aggregation-framework

我不太明白将$or$and运算符用于MongoDB。

假设我有以下数据:

{
    "_id" : "0211dd50-6283-11e6-be4b-01259186ebdc",
    "customer_id" : 75832,
    "prod_display_id" : "8c890b9c-7824-11e5-9cf1-24519096eb0c",
    "record_ids" : [
        ObjectId("1377ki5f8782b634fbf92b07b"),
        ObjectId("6283gf5f922b634fbf32b07a"),
        ObjectId("9913zd5f234b634fbf22b07c")
    ],
    "create_dt" : ISODate("2014-01-12T13:31:42.740Z")
}, 
{
    "_id" : "3454ke24-9372-11e6-be4b-01259186ebdc",
    "customer_id" : 75832,
    "prod_display_id" : "2d723b5c-8823-77y5-9cf1-00259096eb0c",
    "record_ids" : [
        ObjectId("1377ki5f8782b634fbf92b07b")
    ],
    "create_dt" : ISODate("2014-03-12T15:45:01.650Z")
}, 
{
    "_id" : "0211dd50-6283-23t6-it84-63957834kjhdd",
    "customer_id" : 11486,
    "prod_display_id" : "8c890b9c-7824-11e5-9cf1-00259096eb0c",
    "record_ids" : [
        ObjectId("9870kr5f9234b745fbf23g12b")
    ],
    "create_dt" : ISODate("2015-02-23T16:23:53.112Z")
}
....

现在,我想找到具有特定record_id's的所有用户。假设我希望所有拥有ObjectId(....)ObjectId(....)的用户(即一个或另一个)。

我认为正确的聚合运算符是:

> db.collection.aggregate([{ $project: { content_id : {$or : [ObjectId("...."), ObjectId("...")]}}}])

同样,AND操作应该是

> db.collection.aggregate([{ $project: { content_id : {$and : [ObjectId("...."), ObjectId("...")]}}}])
然而,我错了!如果我运行上述操作,两个$project操作都会输出所有文件,无论是否存在某个ObjectId()。我究竟做错了什么?

2 个答案:

答案 0 :(得分:0)

您不需要任何聚合来运行此类简单查询。

    db.collection.find({$or : [{"content_id":ObjectId("....")},{"content_id": ObjectId("...")} ] } )

OR

    db.collection.find({"content_id":{ "$in":[ObjectId("...."),ObjectId("....")] }  } )

https://docs.mongodb.org/v3.0/reference/operator/query/in/

答案 1 :(得分:0)

首先,你不需要汇总;并且您不需要$or运营商。

找到所有"用户"在" record_ids"中有一定的ObjectId只需使用$in运算符。

db.collection.find( { "record_ids": { "$all": <array of record_ids> } } )

找到所有&#34;用户&#34;所有ObjectId都在&#34; record_ids&#34;只需使用$all运算符

即可
db.collection.find( { "record_ids": { "$in": <array of record_ids> } } )