pymongo justOne&多

时间:2013-01-10 13:04:35

标签: pymongo

我有一个带有“testcol”集合的数据库“testdb”,如下所示:

{u'_id': ObjectId('50eeb8029b75941b9af614bd'), u'birth': 1}
{u'_id': ObjectId('50eeb82e9b75941bc820f22c'), u'birth': 2}
{u'_id': ObjectId('50eeb82e9b75941bc820f22d'), u'birth': 3}
{u'_id': ObjectId('50eeb82f9b75941bce96032c'), u'birth': 2}
{u'_id': ObjectId('50eeb82f9b75941bce96032d'), u'birth': 3}

代码如下:

m_connection = MongoClient(M.HOST,M.PORT)
col = m_connection['testdb']['testcol']
#some_operation
cursor = col.find()
for doc in cursor:
        print doc

我试图更新出生高于1的所有文件, 所以我用col.update({'birth':{'$gt':1}},{'$set':{'death':'near'}},{'multi':True})替换some_operation我收到错误:TypeError: upsert must be an instance of bool

同样,我想删除所有出生的文件中只有一个为2 0r 3 我将some_operation替换为col.remove({'birth' : {'$in' : [2,3]}},{'justOne' : 1})我收到错误:TypeError: Wrong type for safe, value must be a boolean

我尝试使用直接布尔代替{}数组,但只更新了一个文档,并且删除了所有出生为2或3的文档。

以防万一与版本有关:我有pymongo-2.4.1和Python2.7 我出错的任何线索? 非常感谢。

编辑: 文件说: update(spec,document [,upsert = False [,manipulate = False [,safe = None [,multi = False [,check_keys = True [,** kwargs]]]]]])

这是否意味着:如果我想使用'multi'= True,我必须强制性地在它之前定义值(upsert,manipulate,safe)?

另外,要删除,它说: 删除([spec_or_id =无[,安全=无[,** kwargs]]]) 'justOne'在哪里提到here ??

1 个答案:

答案 0 :(得分:2)

只要您在multi=的调用中使用update()(例如col.update({'birth':{'$gt':1}}, {'$set':{'death':'near'}}, multi=True)),Python就会为您省略的任何可选参数应用默认值。您可以在http://docs.python.org/2/tutorial/controlflow.html#keyword-arguments

了解有关此行为的更多信息

关于justOne的另一个问题,不幸的是,似乎PyMongo还没有支持它。目前,执行此操作的方法是使用find_one()获取文档,然后将其_id传递给remove()