我有一个带有“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 ??
答案 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()
。