我有一个MongoDB ID列表
id_list = [{u'_id': u'0'}, {u'_id': u'1'}, {u'_id': u'2'}, {u'_id': u'3'}, {u'_id': u'4'}]
我想向MongoDB发出一个查询,并以与列表相同的顺序返回匹配的文档。
但是,以下代码导致TypeError: spec must be an instance of dict
。
from pymongo import MongoClient
if __name__ == '__main__':
db = MongoClient()
sDB = db.test.users
id_list = [{u'_id': u'0'}, {u'_id': u'1'}, {u'_id': u'2'}, {u'_id': u'3'}, {u'_id': u'4'}]
print list(sDB.find(id_list[0:2]))
答案 0 :(得分:2)
MongoDB使用字典进行搜索,你提供了一个数组:
你的例子:
id_list[0:2] is [{u'_id': u'0'}, {u'_id': u'1'}]
相反,您可以使用$in
:
db.test.users.find({'_id':{'$in': ["0", "1", "2"]}})
答案 1 :(得分:1)
必须使用Mongo查询语法,即:
collection.find({"_id": {"$in": [id1, id2, ..., idN]}})
为了尊重它,首先得到一个只需要的ID列表,而不是一个dicts列表:
needed_ids_only = map(lambda x: x['_id'], id_list[0:2])
# needed_ids_only is now == [u'0', u'1']
然后,将其提供给" $ in"操作者:
print list(sDB.find({"_id": {"$in": needed_ids_only}}))
值得一提的是,如果你的文件_id
是一个字符串,正如你所提到的那样,一切都没问题。但如果你的意思是ObjectId,那么在查询之前还需要转换它。
所以,如果你的文件是这样的:
> db.users.find().pretty()
{
_id: '0',
// ...
},
{
_id: '1',
// ...
},
// ...
然后一切都好。但如果他们看起来像这样:
> db.users.find().pretty()
{
_id: ObjectId('0'),
// ...
},
{
_id: ObjectId('1'),
// ...
},
// ...
然后需要将_id值转换为ObjectId:
from bson import ObjectId
needed_ids_only = map(lambda x: ObjectId(x['_id']), id_list[0:2])