-3

mongodb で 2 つのコレクションに参加するにはどうすればよいですか?

参照するフィールドFK_IDがあります。collection2collection1

SQLで私がやっていた

SELECT * FROM collection1 c1 JOIN collection2 c2 on c2.FK_ID = c1.ID

これはうまくいきますか?

db.collection1.join(collection2, {collection1.ID:collection2.FK_ID})

またはこれらの行の周りに何か?ありがとう

4

2 に答える 2

1

いいえ、うまくいきません。MongoDB結合はサポートされていません。一度に 1 つのコレクションに対してのみクエリを実行できます。ある方法で考え始める必要がありNoSQLます。つまり、 を使用することを検討しembedded documents、それができない場合は、DB Referencesドキュメントを参照するために を使用できます。NoSQL を考えてみてください。

補足: 構文を推測することはできません。ドキュメントを読んで、サポートされている操作を確認してください。MongoDBドキュメントは非常に包括的です。

于 2014-02-05T15:38:22.993 に答える
0

基本的に、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, ... ] } });

于 2014-02-05T15:45:33.173 に答える