mongodb,pymongo,aggregate给出奇怪的输出(关于光标的东西)

时间:2015-05-19 18:08:15

标签: mongodb aggregation-framework pymongo

我正在尝试获取数据库中包含最多条目的人员列表。

attr_accessible :name, :address
attr_protected :street_id

a = A.new(:name => "Test", :address => "RandomPlace")
a.street_id = 1

条目如下所示:

print db.points.aggregate(
   [
      {
         "$group":
                    {
                       "_id": "$created.user", 
                       "count":{"$sum":1}
                    }
      },
      {
         "$sort":
                   {"count":-1}
      }
   ]
)

我知道{ u'id': u'342902', u'_id': ObjectId('555af76a029d3b1b0ff9a4be'), u'type': u'node', u'pos': [48.9979746, 8.3719741], u'created': { u'changeset': u'7105928', u'version': u'4', u'uid': u'163673', u'timestamp': u'2011-01-27T18:05:54Z', u'user': u'Free_Jan' } } 存在且无法访问。

我得到的输出仍然是:

created.user

我不应该得到一个排序列表吗?

1 个答案:

答案 0 :(得分:21)

聚合查询的结果是游标,与常规find查询一样。如果pymongo CommandCursor是可迭代的,那么您可以执行以下任何操作:

cursor = db.points.aggregate(...)

# Option 1
print(list(cursor))

# Option 2
for document in cursor:
    print(document)

注意: arun noticed,在这两种情况下,即在您从光标创建列表或在for循环中迭代之后,您将无法重新迭代光标。在这种情况下,如果你想在将来使用它,第一个选项会变得更好,因为你可以根据需要使用获得的列表,因为它已经在内存中了。
无法重复的原因是光标实际上在服务器上,并且它以块为单位发送数据,并且在它发送了所有数据(或服务器终止)之后,光标被破坏。 / p>