【问题标题】:AWS DocumentDB Syntax differs from MongoDB for UpdateManyAWS DocumentDB 语法与用于 UpdateMany 的 MongoDB 不同
【发布时间】:2021-03-17 06:59:17
【问题描述】:

我在从 mongo > documentDB 迁移后尝试使用 substr 执行更新,但是我遇到了一个奇怪的错误。

以下使用 pymongo 在 Mongo 4.0 上工作:

    await db[cls.colname].update_many(
        {'$or': [{'preview_title': {'$exists': False}}, {'preview_title': None}]},
        [{'$set': {'preview_title': {'$substr': ['$title', 0, 70]}}}],
    )

等效的 mongo shell 命令也可以:

db.getCollection('pages').updateMany({'$or': [{'preview_title': {'$exists': false}}, {'preview_title': null}]}, [{'$set': {'preview_title': {'$substrBytes': ['$title', 0, 70]}}}])

但是,切换到 AWS DocumentDB 后,它不接受以数组形式进行的更新,否则将返回此错误:“MongoError: Wrong type for parameter u” image

如果我将命令更改为以下,它将起作用(基本上只是从更新部分中删除方括号):

db.getCollection('pages').updateMany({'$or': [{'preview_title': {'$exists': false}}, {'preview_title': null}]}, {'$set': {'preview_title': {'$substr': ['$title', 0, 70]}}})

这很好,但是,等效的 pymongo 调用似乎不起作用:

await db[cls.colname].update_many(
            {'$or': [{'preview_title': {'$exists': False}}, {'preview_title': None}]},
            {'$set': {'preview_title': {'$substr': ['$title', 0, 70]}}},
        )

它返回以下错误: pymongo.errors.WriteError:文档不能有 $ 前缀字段名称:$substr

【问题讨论】:

    标签: python mongodb pymongo aws-documentdb


    【解决方案1】:

    将数组作为更新传递称为“使用聚合管道更新”。 DocumentDB 显然没有实现这一点(在许多其他 MongoDB 功能中)。

    当您从更新中删除阵列时,您会从使用 https://docs.mongodb.com/manual/reference/operator/aggregation/set/ 更改为使用 https://docs.mongodb.com/manual/reference/operator/update/set/。您会注意到更新 $set 不接受聚合 $set 之类的表达式。因此,您使用 $set 进行的 shell 更新会将(嵌套)文档 {'$substr': ['$title', 0, 70]} 写入 preview 字段。通常以美元开头的键是不可查询的,因为 MongoDB 运算符使用美元前缀,因此将这样的文档写入字段是一个坏主意。 Pymongo 告诉你这个并拒绝操作。 shell 允许它,因为它也被 MongoDB 服务器工程师在内部用于测试,因此它允许完成各种奇怪/不寻常的事情。

    【讨论】:

    • 我确实看到了,这就是为什么我根据问题的后半部分改变了方法。让我失望的是,看似相同的语句正在使用 mongo shell 在 DocDB 上运行,但使用 pymongo 却无法运行。
    • 更新了答案。
    • 知道了,我会采用不同的方法。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 2019-06-20
    • 2020-08-27
    • 2022-06-27
    相关资源
    最近更新 更多