如何在mongoose中更新引用数组

3

我有一个组合集合,其中包含成员引用数组。两个对象如下所示相互连接。当我向组添加新成员时,需要更新组对象的成员字段。如何使用mongoose update运算符来实现这一点。

var MemberSchema = new Schema({
    name:{
        type:String,
        default:null
    },
    user_id:{
        type : Schema.ObjectId,
        ref : 'User',
        default : null
    }
});

var GroupSchema = new Schema({
    name:{
        type:String,
        default:null
    },
    description:{
        type:String,
        default:null
    },
    members:[MemberSchema],

},{collection:"groups"});

感谢您的提前帮助。
更新
我添加了一个小组的示例文档。
{
    "_id" : ObjectId("586a2e694467c41218b302c3"),
    "members" : [ 
        {
            "_id" : ObjectId("586a2e694467c41218b302c6"),
            "user_id" : ObjectId("58171d75e72bf516f92dcd4e"),
            "name" : "Lakmal Kapukotuwa"
        }, 
        {
            "_id" : ObjectId("586a2e694467c41218b302c5"),
            "user_id" : ObjectId("5821807516325e127f59438e"),
            "name" : "Prasad Perera"
        }, 
        {
            "_id" : ObjectId("586a2e694467c41218b302c4"),
            "user_id" : ObjectId("586263515356e908de6c899a"),
            "name" : "Sadun Prasad"
        }
    ],
    "description" : "Des 1",
    "name" : "My group",
    "__v" : 0
}

1
你能否使用问题中的[编辑]链接,向我们展示一个你想要添加到“members”数组中的新成员列表的示例?根据我的理解,如果你提供了一个成员对象列表,并且取决于数组中对象的结构,可能只需要使用$push运算符和$each就可以完成。因此,请提供有关您希望添加的成员的更多信息。 - chridam
@chridam。好的,我已经更新了问题。同时感谢您的快速回复。 - Eranga Kapukotuwa
@chridam。是的,我们可以使用$push运算符来处理它。请将此作为答案发布,我会接受它作为答案。 - Eranga Kapukotuwa
2个回答

6

如果你要将新成员作为对象列表发送,对象的结构应该如下:

membersListToAdd = [ 
    {
        "user_id": "58171d75e72bf516f92dcd4e",
        "name": "foo"
    }, 
    {
        "user_id": "5821807516325e127f59438e",
        "name": "bar"
    }
]

然后在更新中使用$push$each修改器,如下所示:

var query = { name: 'My Group' },
    options = {},
    callback = function (err, result) { console.log(result); };
Group.update(query, { $push: { members: { $each: membersListToAdd } } }, options, callback)

2

你这样做是错误的,

不需要在两个集合中都加入链接,也不需要嵌套模型

可以尝试使用以下方法

var Group = mongoose.model("Group", new Schema({
    name: {
        type:String
    },
    description: {
        type:String
    },
}));

Group.virtual("users", {
    ref: "User",
    localField: "_id",
    foreignField: "groups"
});

var User =  mongoose.model("User", new Schema({
    name:{
        type:String
    },
    groups: [{
        type : Schema.ObjectId,
        ref : 'Group'
    }]
}));

谢谢您的回答。 - Eranga Kapukotuwa
1
为什么 OP 做错了?我真的想知道为什么使用虚拟是更好的解决方案。提前感谢您的回答,祝好。 - Javier Guzmán

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