// Mongoose turns a cursor to an array by default in the callback method
collectionOne.find(query,{ "_id": 1}).limit(limit).exec(function(err,results) {
// Just get array of _id values
var ids = results.map(function(el) { return el._id });
// Not sure if you really mean both collections have the same primary key
// I'm presuming two different fields being "id" as opposed to "_id"
collectionTwo.find({ "id": { "$in": ids } },function(err,items) {
// matching results are here
})
})
これだけです。
あなたがすべては、その後、ちょうどそのの「リスト」として_id
値の最初のクエリ結果を返す「参加あなたが本当に望んでいた場合は、ターゲットコレクション
に関連する分野に$in
にその引数を指定しています『結果に入社"とし、あなたが実際だ。この
collectionOne.aggregate([
{ "$match": query },
{ "$limit": limit },
{ "$lookup": {
"from": "collectionTwo",
"localField": "_id",
"foreignField": "id",
"as": "twoItems"
}}
])
よう$lookup
を使用することができ、MongoDBの3.2を用意して』、とあなたはおそらくだけcollectionTwo
からマッチした結果を返すためにそれを使用することができますが、その後私はペルソナllyはそうしないでしょう。これはサーバ上でさえコストのかかる運動であり、実際にそのフォーマットを返すために必要な操作をさらにフィルタリングすると、さらにコストがかかることになります。
また、.populate()
については、mongooseを参照してください。これは実際にはこのタイプのクエリの「逆」です。その代わりに、関連するコレクション内のオブジェクトの主キーを指すObjectId
の値の配列(または通常のフィールドですが、この場合は配列)を格納するのがプロセスです。したがって、collectionTwo
の「多数」の値がある場合、これらはcollectionOne
文書内の配列に格納されます。
これもまた、「結合エミュレーション」であり、実際の結合ではありません。結果は$lookup
と似ていますが、実際にはcollectionTwo
の結果ではなく、同様にフィルタリングする必要がある「結合」バージョンの「単なる」結果ではありません。
.populate()
で実際に起こるのは、とにかく$in
というクエリを実行するということです。したがって、親に子参照を格納するすべての作業(IMHO、ほとんどの場合、それを行うことができれば、代わりにデータを埋め込むこともできます)でも、データベースとの実際のやりとりは変更されません。 $in
クエリ。
このサーバー側を実行するために$ lookupで集約を使用することができます – profesor79