假设我们使用suggested by MongoDB official documentation引用建模的典型一对多关系:
var User = mongoose.Schema({
});
var Group = mongoose.Schema({
user: [{
type: mongoose.Schema.Types.ObjectId,
ref: 'User'
}]
});
我们还假设我关心用户出现在组中的顺序,因此数组是必需的。
现在,让我们假设用户已被删除 - 并且由于某种原因未使用$pull
维护这些组。如果您使用Mongoose的populate
所有看起来都可以,但垃圾仍然存在于数组中。
有没有办法识别孤立的参考并删除它们?甚至可能是自动的 - 类似于CASCADE
在关系世界中的作用?在Mongo / Mongoose中保持参照完整性的最佳方法是什么?最后,什么是最有效的?
答案 0 :(得分:1)
首先,在用户模型上使用remove
挂钩尝试持续维护数据完整性:User.post('remove', pullUserFromGroups);
希望这样可以保持完整性。您可以使用单个$pull
操作从每个组中删除用户。这是一个类似于来自关系数据库的CASCADE
的mongo。
对于事后清理,您需要迭代每个组,查找group.user
中的每个userId,查询该记录是否存在,如果不存在则将其拉出。一次只执行此操作最简单,但您也可以使用User.find({_id: {$in: group.user}})
然后计算未找到的用户ID并将其拉出来。