Javascript mongo更新脚本:更改嵌入文档中的字段

Javascript mongo更新脚本:更改嵌入文档中的字段,javascript,mongodb,document,Javascript,Mongodb,Document,我正在编写一个脚本来更新(添加和重命名)某些字段,这些字段是存储在db集合中的嵌入文档的一部分 要给出示例文档,请执行以下操作: { _id: UUID("025bda29-0d09-4923-8f7f-ea2e825be2c8"), name: "test", sets: [ { "name": "1", "values": [ { name:

我正在编写一个脚本来更新(添加和重命名)某些字段,这些字段是存储在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);

有人能告诉我为什么会发生这种情况,以及我如何让它按我希望的方式工作吗?

我通过如下方式重写脚本,成功地解决了这个问题:

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”

很抱歉进行了多次编辑,但我遗漏了一些代码布局内容您的示例文档没有main值或oldValue。如何设置和取消设置?oldValuesField只是一个变量名,与集合中文档的“值”字段相关。mainValues是新版本中必须包含的内容
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)