MongoDB向集合中的嵌套对象添加字段

时间:2019-01-12 15:43:07

标签: mongodb aggregation-framework

我有一个场景,其中我填充了嵌套对象,但是很早就做出选择,仅填充显示所需的字段。 现在,我想添加一个我先前遗漏的字段,但是我已经有了数据-如何使用此新字段更新所有现有记录。

这是现有的结构-您将看到汽车可以有多个装饰包,并且我存储了attributeA和B-但实际的装饰包集合具有更多的属性(在...“ C”之下)

cars: {
    model: string,
    trims: [
        trim: {
            _id: ObjectId,
            attributeA: string,
            attributeB: string
        }
    ]
}


trims: {
    attributeA: string,
    attributeB: string,
    attributeC: string
}

我想在所有记录中将AttributeC添加到我的汽车收藏中。不仅添加字段,而且使用该装饰包的正确值填充字段。

任何帮助表示赞赏-我什至不知道从哪里开始,除非它可能是聚合查询

@anthony想举个例子-这是

这里是“饰物”集合-请注意,每个项目都有两个“属性”颜色和完成方式...

trims: [{
    _id: 1,
    base_color: "Black",
    finish: "matte"
},{
    _id: 2,
    base_color: "Red",
    finish: "matte"
},{
    _id: 3,
    trim_color: "Black"
    finish: "matte"
},{    
    _id: 4,
    trim_color: "White"  
    finish: "gloss"
},{    
    _id: 5,
    wheel_color: "Black"
    finish: "matte"
}]

这是汽车的样本集合-带有内饰选项。 -请注意,每个(现有数据)都具有ONE属性的修剪数据...

cars: [{
    model: "Model A",
    trims: [
        trim: {
            _id: "abc111",
            base_color: "Black",
        }
        ,trim: {
            _id: "abc112",
            trim_color: "Black",
        }
        ,trim: {
            _id: "abc113",
            wheel_color: "Black",
        }
    ]
},{
    model: "Model B",
    trims: [
        trim: {
            _id: "abc222",
            base_color: "Red",
        }
        ,trim: {
            _id: "abc223",
            trim_color: "White",
        }
        ,trim: {
            _id: "abc224",
            wheel_color: "Blue",
        }
    ]
},{
    model: "Model T",
    trims: [
        trim: {
            _id: "abc333",
            base_color: "Black",
        }
        ,trim: {
            _id: "abc332",
            trim_color: "Black",
        }
        ,trim: {
            _id: "abc334",
            wheel_color: "Black",
        }
    ]
}]

当我最初写它的时候-我想将'trim'与汽车一起存储,这样我就不必查找显示内容...我没有将表面处理存储在汽车对象中。但是现在我想-因为我的用户界面已更改。

所以我想知道f有一种方法可以用'black'的base_color更新所有修剪...

trim: { base_color: "Black }

将其更新为

trim: { base_color: "Black", finish: "matte" }

此后,我发现最好使用链接而不是嵌入数据来完成此操作-但是我有需要更新的现有数据,因为我试图弄清楚如何“取消嵌套”数据

0 个答案:

没有答案