mongo update script: изменение полей во встроенных документах - PullRequest
1 голос
/ 09 июля 2019

Я пишу скрипт для обновления (добавления и переименования) определенных полей, которые являются частью внедренного документа в тех, которые хранятся в коллекции БД.

, чтобы привести пример документа:

{
    _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.

что происходит, когда я запускаю этот код, так это то, что я получаю поле mainValues ​​ и AdditionalValues ​​ в документе group , а не в набор документов.

Я хочу, чтобы это стало:

{
    _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": [ ]
        }
    ]
}

Может кто-нибудь объяснить мне, почему это происходит и как я могу заставить эту работу работать так, как я этого хочу?

1 Ответ

1 голос
/ 09 июля 2019

Мне удалось это исправить, переписав скрипт так:

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'

...