在MongoDB文档中的新字段中插入一个嵌入式文档

8

我有一个 MongoDB 集合中的文档,格式如下:

{
   _id: 133,
   Name: "abc",
   Price: 20
}

我想添加一个新的字段"PackSizes",它可能是数组类型,也可能不是,然后想在其中嵌入一个文档。例如 -

PackSizes:
         [
             {_id: 123, PackSizeName:"xyz", UnitName:"pqr"}
         ]

or,

PackSizes:  {_id: 123, PackSizeName:"xyz", UnitName:"pqr"}

我是mongodb的新手,请帮忙。

2个回答

15

你可以用它来完成

db.test.update(
   { _id : 133 },
   { $set : { PackSizes:  {_id: 123, PackSizeName:"xyz", UnitName:"pqr"}} }
)

PackSizes可以是任何带有数组或不带数组的文档。

您的结果文档将是:

{
    "_id" : 133,
    "Name" : "abc",
    "Price" : 20,
    "PackSizes" : {
        "_id" : 123,
        "PackSizeName" : "xyz",
        "UnitName" : "pqr"
    }
}

更新: 添加新字段和一个成员到数组中,

假设我们有您的原始文档。

{
   _id: 133,
   Name: "abc",
   Price: 20
}

步骤1:添加新字段:PackSizes 是一个数组

db.test.update(
   { _id : 133 },
   { $set : {PackSizes: [ {_id: 123, PackSizeName:"xyz", UnitName:"pqr"}]}}
)

步骤2:将新项目推送到数组中

db.test.update(
   { _id : 133 },
   { $push : { PackSizes: {_id: 124, PackSizeName:"xyz", UnitName:"pqr"}} }
)

而且你将拥有

{
    "_id" : 133,
    "Name" : "abc",
    "Price" : 20,
    "PackSizes" : [ 
        {
            "_id" : 123,
            "PackSizeName" : "xyz",
            "UnitName" : "pqr"
        }, 
        {
            "_id" : 124,
            "PackSizeName" : "xyz",
            "UnitName" : "pqr"
        }
    ]
}

处理器感谢。请问您如何将新的PackSize添加到PackSizes []字段中? - s.k.paul
db.test.update( { _id : 133 }, { $push : { PackSizes: {_id: 124, PackSizeName:"xyz", UnitName:"pqr"}} } ) - Disposer
它创建了一个错误-字段'PackSizes'必须是一个数组,但其类型为Object。 - s.k.paul
你应该使用$set命令与PackSizes: [{_id: 123,PackSizeName:"xyz",UnitName:"pqr"}],然后按照我说的使用$push命令。我已经测试过了;) - Disposer
我不知道这个,请把它作为完整的命令添加进去? - s.k.paul
1
跳过“步骤1”,直接使用“push”对我也有效。如果没有数组,“push”会为我创建一个新的数组。 - Zhenya

1
在您的Json结构中,_id是mongoDB不可变字段,因此在您的情况下,如果您将_id更改为简单的id,并且_id代表mongo id,则以下JavaScript代码可能可以解决您的问题。
db.test.find().forEach(
           function(doc){ 
      db.upsert.update({},{"$unset:{"id":1,"Name":1,"Price":1}},false,true);
      db.upsert.update({},{"$set":{"PackSizes":doc}},true,false)}
       )

如果您按照您给出的输出实现,则首先应取消设置文档,然后设置更新。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接