我们说我们有mongodb文件:
{'shop':'yes'}
{'shop':'ice_cream'}
{'shop':'grocery'}
{'amenity':'yes'}
{'amenity':'hotel'}
如何在pymongo中编写聚合查询,这将返回两个键共有的值?在该示例中,它应该返回“是”'。
答案 0 :(得分:3)
您的汇总管道将使用$setIntersection
运算符阶段中的$project
。这需要两个或多个数组并返回一个数组,其中包含每个输入数组中出现的元素。另一个有用的聚合运算符是$addToSet
数组运算符,用于为每个分组字段创建不同的值列表,然后可以对其进行比较。
在mongoshell中,插入文档
db.collection.insert([
{'shop':'yes'},
{'shop':'ice_cream'},
{'shop':'grocery'},
{'amenity':'yes'},
{'amenity':'hotel'}
])
您可以尝试以下聚合管道:
db.collection.aggregate([
{
"$group": {
"_id": null,
"shops": {
"$addToSet": "$shop"
},
"amenities": {
"$addToSet": "$amenity"
}
}
},
{
"$project": {
"_id": 0,
"commonToBoth": { "$setIntersection": [ "$shops", "$amenities" ] }
}
}
]);
<强>输出强>:
/* 0 */
{
"result" : [
{
"commonToBoth" : [
"yes"
]
}
],
"ok" : 1
}
<强> Pymongo 强>:
>>> pipe = [
... {"$group": { "_id": None, "shops": {"$addToSet": "$shop"}, "amenities": {"$addToSet": "$amenity"}}},
... { "$project": {"_id": 0, "commonToBoth":{"$setIntersection": ["$shops", "$amenities"]}}}
... ]
>>>
>>> for doc in collection.aggregate(pipe):
... print(doc)
...
{u'commonToBoth': [u'yes']}