PyMongo:TypeError:spec必须是dict的一个实例

时间:2014-11-02 15:06:24

标签: python mongodb python-2.7 pymongo

我有一个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]))

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