基本的に、JOIN を副選択に置き換えることができます。MongoDB は結合を「サポート」していませんが、サブセレクトに似たものをサポートしていますが、結果のスキーマを破滅的に破壊することはありません (疑似コード):
users = db.users.find({criteria});
posts = db.posts.find({authorId : { $in : users.select(p -> p.id) } });
これにより、一致するすべてのユーザーcriteria
と、を介したすべての投稿が検索されます$in
。SQL とは異なり、結果 (異なるクラスにマップされる) は単一の結果 blob に塗りつぶされることはありませんが、ユーザーのリストを取得し、別の要求を通じてユーザーの投稿を取得します。一方、ユーザーをディクショナリに保存し、それらを投稿にマップして、アプリケーション コードで完全に入力されたドメイン モデルを構築する必要がある場合があります。
ただし、NoSQL を使用する場合は、そのようなクエリを避けるようにする必要があることを理解することが重要です。可能であれば、情報を非正規化してみてください。たとえばauthorId
、投稿に を保存するだけでなく、 も保存しauthorName
ます。これにより、投稿のリストを簡単かつ迅速に表示できますが、たとえば、作成者名の変更を同期する必要があるという犠牲が伴います。場合によっては、情報を埋め込むことさえ可能です。たとえば、tags
単に文字列のリスト、つまり
post { title:"foo", tags:["correct", "battery", "staple", "horse"] }
$in
を使用して削除を実行することもできます。db.collection.remove({"_id" : {$in : [ id1, id2, ... ] } });