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}}) ,然后计算找不到的用户标识并将其拉出。