所以我想在Pymongo中使用$ in运算符,我想用一堆MongoID搜索。
首先,我有这个查询来查找MongoID数组:
findUsers = db.users.find_one({'_id':user_id},{'_id':0, 'f':1})
如果我打印findUsers['f']
,它看起来像这样:
[ObjectId('53b2dc0b24c4310292e6def5'), ObjectId('53b6dbb654a7820416a12767')]
这些对象ID是用户ID,我想要做的是使用此ObjectID数组查找users集合中的所有用户。所以我的想法是:
foundUsers = db.users.find({'_id':{'$in':findUsers['f']}})
然而,当我打印foundUsers时,结果如下:
<pymongo.cursor.Cursor object at 0x10d972c50>
这不是我打印查询时通常得到的:(
我在这里做错了什么?
非常感谢。
另外,仅供您参考,我在mongo shell中查询并且它按预期工作:
db.users.find({_id: {$in:[ObjectId('53b2dc0b24c4310292e6def5'), ObjectId('53b6dbb654a7820416a12767')]}})
答案 0 :(得分:2)
您遇到MongoDB中findOne()和find()之间的区别。 findOne返回单个文档。 find()返回一个mongoDB游标。通常,您必须迭代光标以显示结果。您的代码在mongo shell中工作的原因是,如果游标返回20个或更少的文档,mongo shell会以不同的方式处理游标 - 它会为您处理游标迭代:
<强>光标强>
在mongo shell中,读操作的主要方法是 db.collection.find()方法。此方法查询集合和 将光标返回到返回的文档。
要访问文档,您需要迭代光标。但是,在 mongo shell,如果返回的游标未分配给变量 使用var关键字,然后光标自动迭代到 20次[1]以打印结果中的前20个文档。
http://docs.mongodb.org/manual/core/cursors/
迭代游标的pymongo手册页可能是一个很好的起点:
http://api.mongodb.org/python/current/api/pymongo/cursor.html
但是这里有一段代码可以为您说明基础知识。在调用find()之后运行:
for doc in findUsers:
print(doc)