PYMONGO - 如何在MongoIDs中使用查询 $in 操作符?

6 投票
1 回答
7495 浏览
提问于 2025-04-18 12:08

我正在尝试在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数组里的用户。所以我想到了这个方法:

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')]}})

1 个回答

3

你遇到了MongoDB中findOne()和find()的区别。findOne会返回一个单独的文档,而find()则返回一个MongoDB的游标。通常情况下,你需要遍历这个游标才能显示结果。你的代码在mongo shell中能正常工作,是因为mongo shell对游标的处理方式不同,如果返回的文档数量在20个或以下,它会自动帮你遍历游标:

游标

在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)

撰写回答