0

我有一个带有集合“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

我试图更新所有出生大于一的文档,所以我将 some_operation 替换为col.update({'birth':{'$gt':1}},{'$set':{'death':'near'}},{'multi':True})我得到错误: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[,urgical=False[, safe=None[, multi=False[, check_keys=True[, **kwargs]]]]]])

这是否意味着:如果我想使用'multi'=True,我必须强制为它之前的任何东西(upsert、操纵、安全)定义值?

此外,对于删除,它说: remove([spec_or_id=None[, safe=None[, **kwargs]]])这里提到的“justOne”在哪里?

4

1 回答 1

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()获取文档,然后将其传递_idremove().

于 2013-01-11T19:52:48.213 回答