Mongo / Mongoose:清理孤儿文献
假设我们使用MongoDB官方文档build议的引用来build模典型的一对多关系:
var User = mongoose.Schema({ }); var Group = mongoose.Schema({ user: [{ type: mongoose.Schema.Types.ObjectId, ref: 'User' }] });
我们还假设我关心用户出现在组中的顺序,所以这个数组是必须的。
现在让我们假设用户已经被删除了,并且由于某种原因这些组还没有被$pull
维护。 如果你使用Mongoose的populate
一切看起来不错,但垃圾仍然存在于数组中。
有没有办法确定孤儿参考并将其删除? 也许甚至是自动的 – 类似于CASCADE
在关系世界中所做的事情? 在Mongo / Mongoose中维护参照完整性的最佳方法是什么? 最后,最有效的是什么?
首先,在你的User模型上使用一个remove
钩子来持续保持数据的完整性: User.post('remove', pullUserFromGroups);
希望这将保持完整大部分完好无损。 您可以使用$pull
操作从每个组中删除用户。 这是一个mongo类似于关系数据库的CASCADE
。
对于事后清理,您需要迭代每个组,查找group.user
每个userId,查询logging是否存在,如果不存在,则将其拔出。 一次只做一个最简单,但也可以使用User.find({_id: {$in: group.user}})
,然后计算找不到的用户标识并将其拉出。