我是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_number
和brand: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);
答案 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
返回数组中的项目数。