【问题标题】:pymongo justOne & multipymongo justOne & multi
【发布时间】:2013-01-12 03:52:48
【问题描述】:

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

我正在尝试更新所有出生大于一的文档, 所以我用 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 任何线索我哪里出错了? 非常感谢。

编辑: 文档说: 更新(规范,文档[,upsert=假[,操作=假[,安全=无[,多=假[,检查键=真[,**kwargs]]]]]])

这是否意味着:如果我想使用 'multi'=True,我必须强制为它之前的任何内容(更新插入、操作、安全)定义值?

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

【问题讨论】:

    标签: pymongo


    【解决方案1】:

    只要您在对update() 的调用中使用multi=(例如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()

    【讨论】:

    • 从概念上讲,我理解你所说的一切,但是这些语法都不起作用:{'multi'=True}{'multi':True}{multi=True}{multi:True}multi=True'multi'=True...要么我收到语法错误,要么它尝试将“upsert”分配给 True
    • 使用字典是行不通的。并且在参数名称周围加上引号会导致语法错误。你试过我给你的例子了吗?
    猜你喜欢
    • 1970-01-01
    • 2020-05-10
    • 1970-01-01
    • 1970-01-01
    • 2019-09-20
    • 1970-01-01
    • 2019-06-01
    • 1970-01-01
    • 2022-11-04
    相关资源
    最近更新 更多