使用MongoDB进行多次原子更新?

时间:2011-10-19 10:38:46

标签: codeigniter mongodb

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

每条评论都包含:

  • 全名(作者)
  • 注释
  • Created_at

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

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

更新

这是图像文档与评论的外观。 我认为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"
}

感谢所有人的帮助!

1 个答案:

答案 0 :(得分:1)

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

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

最后一个真实标志表示您要更新多个文档。因此,可以在一次更新操作中更新所有注释。

BTW:mongodb和nosql中的denormalazing(非“硬编码”)数据通常是常用的操作。另外需要更新大量文档的操作通常也是异步的。但这取决于你。

<强>更新

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

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