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

hmm*_*bob 12 mongodb pymongo aggregation-framework

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

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

条目如下所示:

{
   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'
               }
}
Run Code Online (Sandbox Code Playgroud)

我知道created.user存在并且可以访问.

我得到的输出仍然是:

<pymongo.command_cursor.CommandCursor object at 0x02ADD6B0>

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

bag*_*rat 24

聚合查询的结果是游标,与常规find查询一样.在的情况下,pymongoCommandCursor是迭代,从而你可以做任何以下内容:

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

# Option 1
print(list(cursor))

# Option 2
for document in cursor:
    print(document)
Run Code Online (Sandbox Code Playgroud)

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

  • 同样要小心(尽管您明确提到它们是两个选项):获取列表后,您无法再次迭代光标。您必须迭代列表。 (3认同)
  • 使用列表(光标)现在似乎不起作用.它在参数中给出***错误:'(光标)' (3认同)