在Mongo 2.6和Pymongo 2.7.1上使用maxTimeMS参数和聚合查询

时间:2014-07-11 06:10:11

标签: mongodb pymongo aggregation-framework

  • 我无法在Mongo 2.6和Pymongo 2.7.1中使用maxTimeMS参数

  • 根据此页面上的文档Official Mongodb Aggregation Page,聚合方法应返回Cursor个对象。但是,当我在mongod实例(2.6+)上使用pymongo 2.7.1本地运行查询时,我得到一个dict对象!

  

在[14]中:obj = coll.aggregate({'$ group':{'_ id':'$ l','n':{'$ sum':   1}}})

     

在[15]中:type(obj)Out [15]:dict

有谁能帮我理解这里发生的事情?

2 个答案:

答案 0 :(得分:2)

是的,您可以将maxTimeMS与pymongo聚合一起使用。

c.foo.bar.aggregate([], maxTimeMS=1000)
{u'ok': 1.0, u'result': []}

如果你想要一个光标:

for result in c.foo.bar.aggregate([], cursor={}, maxTimeMS=1000):
... print result

在MongoDB 2.6之前,聚合命令不支持游标,因此必须将其添加为选项以避免破坏现有应用程序。

答案 1 :(得分:-1)

driver documentation中对此进行了介绍,其中描述了为了返回游标,您需要在.aggregate()方法中指定除管道之外的参数:

cursor = coll.aggregate([{'$group': { '_id': '$l', 'n': {'$sum': 1} }}],cursor={})

请注意,此处返回的对象是CommandCursor而不是cursor

这是因为各种修饰符(如.limit().skip())和其他选项不适用于聚合结果的上下文。因此$maxTimeMS不是此类游标的有效选项。

此外,即使有效,它也不会做你认为的那样。原因是“游标”执行仅在“聚合管道”执行完成后计算,所以在这种情况下,只需获取结果。

查看.currentOp().killOp()实现,了解控制长时间运行的聚合任务的其他方法。