如何根据某些字段查找同一集合中匹配的文档数?

时间:2016-07-14 06:51:34

标签: mongodb mongodb-query aggregation-framework

我是MongoBb.Tried的新成员,但无法编写一个查询,可以提供来自两个不同品牌的匹配数量的用户。

我有一个名为users的集合,数据如下:

{
    "_id" : ObjectId("574c09aaa49544e70a694940"),
    "phone_number" : "919876543210",
    "name" : "Jack",
    "brand" : "A"
},
{
    "_id" : ObjectId("574c09aaa49544e70a694840"),
    "phone_number" : "910123456789",
    "name" : "John",
    "brand" : "B"
},
{
    "_id" : ObjectId("574c09aaa49544e70a695040"),
    "phone_number" : "919876543210",
    "name" : "Jack",
    "brand" : "B"
}

我的问题是,我想找到phone_numberbrand:A两个品牌中都存在的brand:B

我写了下面的db脚本,工作正常。但我想要一个mongo查询,给我一个相同的结果。

conn = new Mongo();
db = conn.getDB("users-db");
var phoneNumberList = [];
var query1 = {
    brand: "A"
};
db.users.find(query1).forEach(function(obj) {
    if (obj.phone_number) {
        print(obj.phone_number);
        phoneNumberList.push(obj.phone_number);
    }
})
print("Size of phoneNumberList", phoneNumberList.length);
var query2 = {
    brand: "B",
    phone_number: { $in: phoneNumberList }
};
var matchedUser = db.users.find(query2).count();
print("Total Matched Users", matchedUser); 

1 个答案:

答案 0 :(得分:2)

您使用的是错误的方法。您需要使用.aggregate()方法。

db.users.aggregate(
    [ 
        { "$match": { "brand": { "$in": [ "A", "B" ] } } },
        { "$group": { 
            "_id": "$phone_number", 
            "brand": { "$addToSet": "$brand" } 
        }},
        { "$match": { "brand": { "$all": ["A", "B"] } } },
        { "$group": { "_id": null, "phone_numbers": { "$push": "$_id" }, "count": { "$sum": 1 } } }
    ]
) 

$match运算符仅选择满足给定条件的那些文档。这里的条件是$in,如果"品牌"则返回true。是" A"或" B"。

然后通过" phone_number" $group并使用$addToSet累加器运算符返回一个不同的"品牌"对于小组。

然后,您需要另一个$match,只能使用$all查询运算符选择符合条件的文档。

最后,您将另一个$group阶段添加到管道并使用$push累加器运算符返回" phone_number"的数组。和$sum返回数组中的项目数。