Как добавить атрибут ко всем документам в коллекции с такими же данными другого атрибута в MongoDB? - PullRequest
1 голос
/ 18 февраля 2020

Я видел этот вопрос , и он может быть полезен, но мне нужны дополнительные шаги.

У меня есть коллекция Sites, заполненная name, data и поле с именем infoBox, которое является объектом.

infoBox: {
    coordX: {
      type: Number,
    },
    coordY: {
      type: Number,
    },
    type: {
      type: Number,
      enum: [InfoBoxType.line, InfoBoxType.horizontal, InfoBoxType.vertical],
    },
    midPoint: {
      coordX: {
        type: Number,
      },
      coordY: {
        type: Number,
      },
    },

Итак, мне нужно добавить еще один атрибут для всех информационных блоков сайтов с именем "levels", который является массивом , и это поле должно содержать два объекта, например InfoBox, с одинаковыми значениями, но с пустыми «уровнями». (оба инфобокса 1 и 2 с одинаковыми значениями). Это для инициализации БД, позже эти значения будут редактироваться пользователями.

Пытаясь прояснить ситуацию, я на самом деле имею:

Site
    data
    name
    infobox
        coordx
        coordy
        midpoint
            coordx
            coordy

и мне нужно

Site 
    data
    name
    infobox
        coordx
        coordy
        midpoint
            coordx
            coordy
        levels  
            infobox1
                coordx
                coordy
                midpoint
                    coordx
                    coordy
                levels(empty)
            infobox2
                coordx
                coordy
                midpoint
                    coordx
                    coordy
                levels(empty)

Как мне выполнить sh это?

Дополнительная информация: пн go версия 4.2

РЕДАКТИРОВАТЬ

Я пытаюсь сделать это с чем-то вроде этого, но безуспешно:

let sites = await this.siteModel.find({});
 const firstZoom = site.infoBox;
 const secondZoom =  site.infoBox;

  const levelss = [
    firstZoom,
    secondZoom,
  ];

await this.siteModel.update({ _id: site._id }, { $set: { 'infoBox.levels.$': levelss } });

Ответы [ 2 ]

1 голос
/ 20 февраля 2020

В MongoDB v 4.2, которая поддерживает конвейер агрегации в операциях обновления, вы можете попробовать это (вы также можете использовать .updateMany () ):

this.siteModel.update({},
    [{
        $set: {
            'infobox.levels': [{ infobox1: { $mergeObjects: ['$infobox', { 'levels': [] }] } },
            { infobox2: { $mergeObjects: ['$infobox', { 'levels': [] }] } }]
        }
    }], { multi: true })

Ref: .update ()

Сбор данных:

/* 1 */
{
    "_id" : ObjectId("5e4dba9e7f8bc30a75c658fc"),
    "data" : 1,
    "name" : "noName",
    "infobox" : {
        "coordx" : 2,
        "coordy" : 2,
        "midpoint" : {
            "coordx" : 1,
            "coordy" : 1
        }
    }
}

/* 2 */
{
    "_id" : ObjectId("5e4dbab07f8bc30a75c65ab1"),
    "data" : 2,
    "name" : "yesName",
    "infobox" : {
        "coordx" : 4,
        "coordy" : 4,
        "midpoint" : {
            "coordx" : 2,
            "coordy" : 2
        }
    }
}

Документы в БД после операции обновления:

/* 1 */
{
    "_id" : ObjectId("5e4dba9e7f8bc30a75c658fc"),
    "data" : 1,
    "name" : "noName",
    "infobox" : {
        "coordx" : 2,
        "coordy" : 2,
        "midpoint" : {
            "coordx" : 1,
            "coordy" : 1
        },
        "levels" : [ 
            {
                "infobox1" : {
                    "coordx" : 2,
                    "coordy" : 2,
                    "midpoint" : {
                        "coordx" : 1,
                        "coordy" : 1
                    },
                    "levels" : []
                }
            }, 
            {
                "infobox2" : {
                    "coordx" : 2,
                    "coordy" : 2,
                    "midpoint" : {
                        "coordx" : 1,
                        "coordy" : 1
                    },
                    "levels" : []
                }
            }
        ]
    }
}

/* 2 */
{
    "_id" : ObjectId("5e4dbab07f8bc30a75c65ab1"),
    "data" : 2,
    "name" : "yesName",
    "infobox" : {
        "coordx" : 4,
        "coordy" : 4,
        "midpoint" : {
            "coordx" : 2,
            "coordy" : 2
        },
        "levels" : [ 
            {
                "infobox1" : {
                    "coordx" : 4,
                    "coordy" : 4,
                    "midpoint" : {
                        "coordx" : 2,
                        "coordy" : 2
                    },
                    "levels" : []
                }
            }, 
            {
                "infobox2" : {
                    "coordx" : 4,
                    "coordy" : 4,
                    "midpoint" : {
                        "coordx" : 2,
                        "coordy" : 2
                    },
                    "levels" : []
                }
            }
        ]
    }
}
0 голосов
/ 19 февраля 2020

Просто используйте . для создания нового ключа объекта.

Site.levels = {}
Site.levels.infobox1 = Site.infobox
Site.levels.infobox2 = Site.infobox
...