在我的MEAN应用程序中,我有两个对象,即用户和组,当用户加入组时,引用被添加到数组字段' groups'在用户对象上。
我正努力找到一个清洁的解决方案来清理'来自'组的组参考'删除组后(从API路由),用户对象上的数组属性。
以下是参考模型:
var db = require("mongoose);
var User = db.model("User", {
//Other fields..
groups: { type: [{ type: db.Schema.Types.ObjectId, ref: "Group" }], select: false }
});
var Group = db.model("Group", {
//Other fields
members: { type: [{ type: db.Schema.Types.ObjectId, ref: "User" }], select: false }
});
我目前正在使用异步模块对每个成员执行async.each()操作(在从查询中填充它们之后)并删除组引用,然后一旦所有成员执行了删除动作我最终删除了最终回调中的组引用。
我现在在这里,这是一个来自组控制器的片段,还有更多必需的模块等。
var router = require("express").Router(),
User = require("user"),
Group = require("group"),
async = require("async");
router.post("/delete", function (req, res, next) {
var group_id = req.body.group_id;
Group
.findOne({
_id: group_id,
})
.select("members")
.populate("members")
.exec(function (error, group) {
if (error) { return next(error); }
//Loop through the members, delete the reference of the group
async.each(group.members, function (member, callback) {
/*
Find the group reference in the user's group list, then splice
*/
var index = member.groups.indexOf(group._id);
member.groups.splice(index, 1);
//Save the user, then finish the function on success..
user.save(function (error, user) {
if (error) { return next(error); }
callback();
});
},
function (error) {
if (error) {
return next(error);
console.log("An error occured removing a group reference from a users group list");
}
//Finally, remove the group
group.remove(function (error, group) {
if (error) { return next(error); }
return res.json("Group deleted");
});
});
});
});
我的问题是对任何Mongoose开发人员来说,你如何处理这个用例,在删除它之前循环通过组的每个成员来删除引用似乎是错误的,你如何处理这种情况?
我认为可能更好的解决方案就是删除组,而不是删除成员中的组引用,然后删除请求中引用用户组的引用,例如,在获取用户时从组数组中删除任何空引用,但是我必须先保存用户,然后再将其发送回客户端...
在这个头上有点混乱,任何建议都会受到谴责!