如何在MongoDB中向子文档数组添加子文档

6

我有一个类似于这样的mongodb集合:

{
"_id" : ObjectId("5393006538efaae30ec2d458"),
"userName" : "shiva",
"userUnderApiKey" : 123456,
"groups" : [
    {
        "groupName" : "Default",
        "groupMembers" : [ ]
    }
]
}

我想在groups数组中作为子文档添加一个新组,就像下面这样。
 {
"_id" : ObjectId("5393006538efaae30ec2d458"),
"userName" : "shiva",
"userUnderApiKey" : 123456,
"groups" : [
    {
        "groupName" : "Default",
        "groupMembers" : [ ]
    },

    {
        "groupName" : "Family",
        "groupMembers" : [ ]
    }
]
}

如何在子文档数组中插入新的子文档。任何帮助将不胜感激。
3个回答

13

要向数组中添加新成员,您只需像平常一样使用$push

db.collection.update(
    { "_id": ObjectId("5393006538efaae30ec2d458") },
    { 
        "$push": {
            "groups": {
                "groupName" : "Family",
                "groupMembers" : [ ]
            }
        }
    }
)

如果您想要向包含成员的数组中添加成员,则需要将要添加的元素与所需匹配:

db.collection.update(
    { 
        "_id": ObjectId("5393006538efaae30ec2d458"),
        "groups.groupName" : "Family",
    },
    { 
        "$push": {
            "groups.$.groupMembers" : "bill"
        }
    }
)

完美运作,您能否发布从“groupMembers”中删除成员和从“groups”列表中删除组的操作。这对像我这样的新学习者更有用。再次感谢您。 - Mulagala
@Mulagala,对于您来说最好的参考资料是文档,例如给出的链接中提到的$push运算符。您想要删除的选项是$pull,文档中包含了各种样例。如果您在理解文档或如何将其应用于特定问题方面遇到问题,那么请随时发布另一个问题。当然,在搜索现有答案后。 - Neil Lunn

2

我认为您会对$push感兴趣。

$push操作符将指定的值追加到数组中。

以及$addToSet

$addToSet操作符仅在该值不在数组中时将其添加到数组中。如果该值已经在数组中,$addToSet将不会修改数组。

您可以在上面的文档中找到示例。它应该是这样的:

db.collection.update({
    _id: ObjectId("5393006538efaae30ec2d458")
}, {
    $push: {
        groups: {
            "groupName": "Family",
            "groupMembers": []
        }
    }
});

我能否使用$push操作符将数据推送到一个子文档数组中,而该子文档数组本身又位于另一个子文档数组中?这实际上比此问题引用的示例多了一层嵌套。我今天在SO上发布了一个关于此问题的问题 - Web User

0
SampleModel:
{
"Name":String,
"brandid": {
        type: Schema.ObjectId,
        ref: 'BrandList.BrandItems',
    }
}

BrandModel:
{
    "BrandName" : String,
    "BrandItems": [{
        "KG": Number,
        "_id" : {type: Schema.ObjectId}
    }]
}

如何引用子文档数组对象ID到另一个模型..以及如何使用populate来获取"品牌ID"的内容。

请给我一些解决此问题的解决方案...


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