如何在集合中的所有文档中添加属性,而在MongoDB中具有另一个属性的相同数据?

问题描述 投票:1回答:2

我见过this question,它可能有用,但是我需要一些额外的步骤。

我有一个Sites的集合,其中填充了namedata和一个称为对象的字段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]的网站的所有信息框添加另一个外观,即array,并且该字段必须包含两个对象,例如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)

我该如何完成?

附加信息:Mongo版本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 } });
javascript mongodb mongoose mongodb-query
2个回答
1
投票

在更新操作中支持聚合管道的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
投票

只需使用.创建一个新的对象键。

Site.levels = {}
Site.levels.infobox1 = Site.infobox
Site.levels.infobox2 = Site.infobox
© www.soinside.com 2019 - 2024. All rights reserved.