【问题标题】:incrementing version number in a subdocument and the parent document增加子文档和父文档中的版本号
【发布时间】:2018-03-12 22:30:40
【问题描述】:

我正在尝试在文档及其子文档中添加版本控制级别。这是一个架构示例

{
    "_id" : ObjectId("59d1312a8ee6de1858933950"),
    "synonyms" : [ 
        {
            "_id" : ObjectId("59d1312a8ee6de1858933954"),
            "text" : [ 
                1.0, 
                2.0, 
                3.0
            ],
            "__v" : 1.0
        }, 
        {
            "_id" : ObjectId("59d1312a8ee6de1858933953"),
            "text" : [ 
                "Foo ", 
                "bar ", 
                "Baz"
            ],
            "__v" : 0
        }, 
        {
            "_id" : ObjectId("59d1312a8ee6de1858933951"),
            "text" : [ 
                "fizz", 
                "bazz", 
                "bizz"
            ],
            "__v" : 0
        }
    ],
    "__v" : 3.0
}

如您所见,父文档有自己的__v,而每个子文档(同义词数组的一部分)也有自己的__v。我想要完成的是这个

  • 更新子文档数组时 - 增加子文档的版本及其父版本

为此,我尝试了以下代码

db.collection.update({
    '_id': ObjectId("59d1312a8ee6de1858933950"),
    "synonyms._id": ObjectId("59d1312a8ee6de1858933954")
},
    {$set: {'synonyms.$.text': [1,2,3]}, $inc: {'synonyms.$.__v': 1}, $inc: {"__v": 1}}
)

我的父母__v 每次更新都会增加,但无论我经历多少次更新,子文档似乎都停留在1.0。有没有更好的办法?

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    如果您将传递给 MongoDB 命令的参数视为 JSON 文档而不是字符串,这很有意义:两次传入相同的运算符(如开头的 $inc 和稍后的 $inc再次在您的示例中)将创建一个仅包含最后一个参数的 JSON 文档。如果您在这里使用的字符串实际上代表一个带有两个 $inc 字段的 JSON 文档,情况会有所不同。

    所以这里是正确的方法(基本上是通过$incing 两个字段作为单个操作的一部分):

    db.collection.update({
        '_id': ObjectId("59d1312a8ee6de1858933950"),
        "synonyms._id": ObjectId("59d1312a8ee6de1858933954")
    },
        {$set: {'synonyms.$.text': [1,2,3]}, $inc: {'synonyms.$.__v': 1, "__v": 1}}
    )
    

    【讨论】:

      猜你喜欢
      • 2015-02-10
      • 1970-01-01
      • 1970-01-01
      • 2011-02-07
      • 1970-01-01
      • 2014-08-27
      • 2015-08-18
      • 1970-01-01
      相关资源
      最近更新 更多