Mongo / Mongoose:清理孤儿

时间:2013-08-07 16:20:28

标签: node.js mongodb mongoose

假设我们使用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中保持参照完整性的最佳方法是什么?最后,什么是最有效的?

1 个答案:

答案 0 :(得分:1)

首先,在用户模型上使用remove挂钩尝试持续维护数据完整性:User.post('remove', pullUserFromGroups);希望这样可以保持完整性。您可以使用单个$pull操作从每个组中删除用户。这是一个类似于来自关系数据库的CASCADE的mongo。

对于事后清理,您需要迭代每个组,查找group.user中的每个userId,查询该记录是否存在,如果不存在则将其拉出。一次只执行此操作最简单,但您也可以使用User.find({_id: {$in: group.user}})然后计算未找到的用户ID并将其拉出来。