如何找到不同领域常见的值[pymongo aggregate]

时间:2015-05-01 11:33:28

标签: python mongodb aggregation-framework pymongo

我们说我们有mongodb文件:

{'shop':'yes'}
{'shop':'ice_cream'}
{'shop':'grocery'}
{'amenity':'yes'}
{'amenity':'hotel'}

如何在pymongo中编写聚合查询,这将返回两个键共有的值?在该示例中,它应该返回“是”'。

1 个答案:

答案 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']}