【问题标题】:Multiple atomic updates using MongoDB?使用 MongoDB 的多个原子更新?
【发布时间】:2011-10-19 10:38:45
【问题描述】:

我正在使用 Codeigniter 和 Alex Bilbie 的 MongoDB 库。 在我正在开发的 API 中,用户可以上传图片,其他用户可以对其发表评论。 我已选择将 cmets 作为子文档包含在图像中。

每条评论包含:

  • 全名(作者)
  • 评论
  • Created_at

换句话说。用户的全名被“硬编码”到每条评论中,所以如果他们 后来决定改名我有问题。

我读到我可以使用原子更新来更新所有出现的名称(例如在 cmets 中),但是如何使用 Alex 的库来做到这一点?我可以更新所有名称错误的地方吗?

更新

这就是图像文档在 cmets 中的样子。 我认为 MongoDB 鼓励使用子文档但不包含更新数组中多个项目的方法,这很奇怪。

{
    "_id": ObjectId("4e9ead773dc793dc01020000"),
    "description": "An image",
    "category": "accident",
    "comments": [
        {
            "id": ObjectId("4e96bd063dc7937202000000"),
            "fullname": "James Bond",
            "comment": "This is a comment.",
            "created_at": "2011-10-19 13:02:40"
        }
    ],
    "created_at": "2011-10-19 12:59:03"
}

感谢大家的帮助!

【问题讨论】:

    标签: codeigniter mongodb


    【解决方案1】:

    我对codeignitor不熟悉,但是mb mongodb shell语法会帮助你:

    db.comments.update( {"Fullname":"Andrew Orsich"}, 
                        { $set : { Fullname: "New name"} }, false, true )
    

    最后一个 true 标志表示您要更新多个文档。因此可以在一次更新操作中更新所有 cmets。

    顺便说一句:在 mongodb 和 nosql 中对数据进行非规范化(不是“硬编码”)通常是通常的操作。此外,需要更新大量文档的操作通常是异步工作的。但这取决于你。

    更新:

    db.comments.update( {"comments.Fullname":"Andrew Orsich"}, 
                        { $set : { comments.$.Fullname: "New name"} }, false, true )
    

    但是,上面的查询将在嵌套数组的第一条评论中更新全名。如果您需要影响对多个数组元素的更改,则需要使用多个更新语句。

    【讨论】:

    • 谢谢!我用一个例子更新了我的问题。如何使用 ID 和该结构访问和更改评论?
    猜你喜欢
    • 2019-05-25
    • 2018-03-02
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多