【问题标题】:mongo update script: change fields in embedded documentsmongo 更新脚本:更改嵌入文档中的字段
【发布时间】:2019-07-09 21:13:36
【问题描述】:

我正在编写一个脚本来更新(添加和重命名)某些字段,这些字段是存储在 db 集合中的嵌入文档的一部分。

举个例子:

{
    _id: UUID("025bda29-0d09-4923-8f7f-ea2e825be2c8"),
    name: "test",
    sets: [
       {
           "name": "1",
           "values": [
               {
                   name: "a",
                   value: 5
               }
           ]
       },
       {
           "name": "2",
           "values": [
               {
                   name: "a",
                   value: 3
               }
           ]
       }
   ]
}

这是我的脚本:

function convertGroup (group) {
    for (var i = 0; i < group.sets.length; i++) {
        var set = group.sets[i];
        var oldValuesField = "sets." + i.toString() + ".values";
        var mainValuesField = "sets." + i.toString() + "mainValues";
        var additionalValuesField = "sets." + i.toString() + ".additionalValues";
        db.getCollection('group').updateOne({ 
            "_id" : group._id 
        }, { 
            $set: {
                mainValuesField : set.values,
                additionalValuesField : [ ] 
            },
            $unset: {
                oldValuesField: ""
            }
        });
    }
}
db.getCollection('group').find({'sets.0.mainValues': {$exists: false}}).forEach(convertGroup);

根据文档,$rename 不适用于数组,这就是我使用 set 和 unset 的原因。

运行此代码时发生的情况是,我在 group 文档中获得了 ma​​inValues 字段和 additionalValues 字段,而不是在set 文件。

这就是我想要的样子:

{
    _id: UUID("025bda29-0d09-4923-8f7f-ea2e825be2c8"),
    name: "test",
    sets: [
       {
           "name": "1",
           "mainValues": [
               {
                   name: "a",
                   value: 5
               }
           ],
           "additionalValues": [ ]
        },
        {
           "name": "2",
           "mainValues": [
               {
                   name: "a",
                   value: 3
               }
           ],
           "additionalValues": [ ]
        }
    ]
}

谁能向我解释为什么会发生这种情况以及我如何才能按照我想要的方式进行这项工作?

【问题讨论】:

  • 很抱歉进行了多次编辑,但我错过了一些代码布局
  • 您的示例文档,没有 mainValues 或 oldValues。你是怎么设置和取消设置的?
  • oldValuesField 只是一个变量名,与集合中文档的“值”字段相关。 mainValues 是它在新版本中所必须的

标签: javascript mongodb document


【解决方案1】:

我设法通过像这样重写脚本来修复它:

function convertGroup(group) {

    group.sets.forEach(function (set) {
        if (!set.mainValues) {
            $set : {
                set.mainValues = set.values
            }
       }

        if (!set.additionalValues) {
            $set : {
                set.additionalValues = []
            }
        }
    });
    db.getCollection('group').update({'_id': group._id}, group);
}
db.getCollection('group').find({'sets.mainValues': {$exists: false}}).forEach(convertGroup)

不同之处主要是不使用符号'sets.[index].values',而是直接在json上编辑它并使用'update'而不是'updateOne'

【讨论】:

    猜你喜欢
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多