2

假设我们按照MongoDB 官方文档的建议使用引用建模典型的一对多关系:

var User = mongoose.Schema({

});

var Group = mongoose.Schema({

  user: [{
    type: mongoose.Schema.Types.ObjectId,
    ref: 'User'
  }]

});

我们还假设我关心用户出现在组中的顺序,所以数组是必要的。

$pull现在,让我们假设用户已被删除——并且由于某种原因没有维护组。如果您使用 Mongoose ,populate一切看起来都很好,但垃圾仍然存在于数组中。

有没有办法识别孤立的 refs 并删除它们?甚至可能是自动的——类似于CASCADE关系世界中的情况?在 Mongo/Mongoose 中保持参照完整性的最佳方法是什么?最后,什么是最有效的?

4

1 回答 1

1

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

对于事后清理,您需要遍历每个 Group,找到每个 userId in group.user,查询记录是否存在,如果不存在则将其拉出。一次只做一个是最简单的,但您也可以使用User.find({_id: {$in: group.user}})然后计算未找到的用户 ID 并以这种方式提取它们。

于 2013-08-07T17:10:18.057 回答