2

MongoDB の公式ドキュメントで提案されているように、参照を使用してモデル化された典型的な 1 対多の関係があるとします。

var User = mongoose.Schema({

});

var Group = mongoose.Schema({

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

});

また、ユーザーがグループに表示される順序が重要であると仮定すると、配列が必要になります。

$pullここで、ユーザーが削除され、グループが何らかの理由で維持されていないと仮定しましょう。Mongoose を使用するとpopulateすべて問題ないように見えますが、配列内にガベージが残ります。

孤立した参照を特定して削除する方法はありますか? おそらく自動的に -CASCADEリレーショナルの世界で何をするのと同じように? Mongo/Mongooseで参照整合性を維持するための最良のアプローチは何ですか? 最後に、最も効率的なものは何ですか?

4

1 に答える 1

1

まず、removeUser モデルにフックを使用して、継続的にデータの整合性を維持しようとします。User.post('remove', pullUserFromGroups);うまくいけば、整合性がほとんどそのまま維持されます。1 回の操作ですべてのグループからユーザーを削除できます$pull。これは、CASCADEリレーショナル DB の mongo 類似物です。

事後のクリーンアップでは、すべてのグループを反復処理し、 内のすべての userId を検索しgroup.user、クエリを実行してレコードが存在するかどうかを確認し、存在しない場合はそれを引き出す必要があります。これを一度に 1 つずつ実行するのが最も簡単ですが、User.find({_id: {$in: group.user}})見つからないユーザー ID を使用して計算し、そのようにプルすることもできます。

于 2013-08-07T17:10:18.057 に答える