使用asyncmongo从MongoDB返回不同的键

时间:2012-09-24 18:37:30

标签: python mongodb tornado pymongo

我正在使用带有Tornado + gen.engine的asyncmongo,并且想知道相当于db.collection.distinct("mykey")的语法是什么?

我认为它类似于

result, error = yield gen.Task(settings.DB.my_data.find, {}, distinct=[("key","mykey")])

但这不起作用。无论出于何种原因,我都无法在网上找到任何这样的例子。

感谢。

2 个答案:

答案 0 :(得分:3)

问题是,“distinct”不是查询的选项,它是一个单独的命令:

http://www.mongodb.org/display/DOCS/Aggregation#Aggregation-Distinct

所以使用AsyncMongo的command()方法:

>>> from tornado.ioloop import IOLoop
>>> import asyncmongo
>>> db = asyncmongo.Client(pool_id='mydb', host='127.0.0.1', port=27017, maxcached=10, maxconnections=50, dbname='test')
>>> def callback(result, error):
...     print result
...     IOLoop.instance().stop()
...
>>> db.command('distinct', 'my_data', key='my_key', callback=callback)
>>> IOLoop.instance().start()
{u'stats': {u'cursor': u'BasicCursor', u'timems': 0, u'nscannedObjects': 5, u'nscanned': 5, u'n': 5}, u'values': [1.0, 2.0], u'ok': 1.0}

您需要的数据是结果['值']。

使用AsyncMongo命令的更多示例都在其测试套件中:

https://github.com/bitly/asyncmongo/blob/master/test/test_command.py

一般来说有关MongoDB命令的信息(这些示例都在PHP中,但即使是像我们这样的Python编码器也很容易理解):

http://www.kchodorow.com/blog/2011/01/25/why-command-helpers-suck/

答案 1 :(得分:1)

结果我将切换到Motor,它支持distinct()作为查询,加上http://emptysquare.net/motor/pymongo/api/motor/generator_interface.html#generator-interface,这对于等待多个查询在触发回调之前完成非常方便。