我想计算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"
答案 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 }