我有一个包含子引用数组的架构:
const schemaSet = {
userSchema: new Schema({
name: {
type: String,
required: true
}
}),
groupSchema: new Schema({
name: {
type: String,
required: true
},
members: [ {
type: Schema.Types.ObjectId
ref: 'User'
}]
})
}
这可以很好地创建组并向其中添加用户,但我发现我无法从组中删除用户。
到目前为止,我得到的最接近的是:
async removeUser(group, userId) {
console.log("Before: group has "+group.members.length+" members");
await group.members.pull({ _id : userId });
console.log("After: group has "+group.members.length+" members");
await group.save();
}
这将在调用前后注销正确的大小,并且运行时不会出现错误,但下次检索该组时,该成员仍然存在。我也尝试过使用remove
,结果基本相同。
我只想从members
集合中删除引用,用户需要持久化。如何坚持删除对文档的引用?
我花了一段时间才发现这一点。如果您有一个组模型(使用const Group = mongoose.model("Group", groupSchema)
创建(,以及要从组中删除的用户的id,则可以使用以下语法:const updatedGroup = await Group.findOneAndUpdate({ members: userId }, { $pull: { members: userId }}, {new: true, useFindAndModify: false});
该函数中的第三个参数表示应该返回更新后的文档,并确保不会收到警告。实际上,只有当组与用户的关系是一对多(即任何用户只能在一个组中(时,该语法才会起作用。如果关系是多对多的,我想你必须使用以下内容:await Group.where({ members: userId}).update({ $pull: { members: userId }});