用钥匙从所有文件中收集的Pymongo计数元素

时间:2014-08-06 23:10:04

标签: python mongodb mongodb-query aggregation-framework pymongo

我想计算MongoDB集合中somekey中出现的所有元素。

当前代码会查看somekey中的所有元素作为一个整体。

from pymongo import Connection

con = Connection()
db = con.database

collection = db.collection

from bson.code import Code
reducer = Code("""
  function(obj, prev){
  prev.count++;
  }
  """)

from bson.son import SON
results = collection.group(key={"somekey":1}, condition={}, initial={"count": 0}, reduce=reducer)
for doc in results:
  print doc

但是,我希望它使用somekey计算任何文档中出现的所有元素。

这是一个预期的例子。 MongoDB有以下文件。

{ "_id" : 1, “somekey" : [“AB", “CD"], "someotherkey" : "X" }
{ "_id" : 2, “somekey" : [“AB", “XY”], "someotherkey" : "Y" }

结果应该提供一个按计数的有序列表:

count: 2 "AB"
count: 1 "CD"
count: 1 "XY"

1 个答案:

答案 0 :(得分:2)

.group()方法不适用于作为数组的元素,最接近的类似物是mapReduce,您可以更好地控制发出的键。

但真正更合适的是aggregation framework。它是在本机代码中实现的,因为它不像其他方法那样使用JavaScript解释器处理。

你不会得到一个"有序列表"来自MongoDB的回复,但是您得到了类似的文档结果:

results = collection.aggregate([
    # Unwind the array
    { "$unwind": "somekey" },

    # Group the results and count
    { "$group": {
        "_id": "$somekey",
        "count": { "$sum": 1 }
    }}
])

给你类似的东西:

{ "_id": "AB", "count": 2 }
{ "_id": "CD", "count": 1 }
{ "_id": "XY", "count": 1 }