2016-09-15 6 views
0

私はそれの中にMongoDBデータベースと2つのコレクション:programsexercisesを持っています。 programsコレクション内のドキュメントは、そのように、exercisesテーブル内のIDの文字列表現が含まれているexercisesフィールドを持っている:MongoDBを使用して_idの配列を1つのクエリでドキュメントにマップする方法はありますか?

{ 
    "_id" : ObjectId("57da8f955cf29df682932ee9"), 
     "exercises" : [ 
      "57da8e01d0649e646afaea4e", 
      "57da8e01d0649e646afaea4e", 
      "57da8e01d0649e646afaea4e" 
     ] 
} 

私は、関連exercisesオブジェクトの配列にIDのこの配列をマッピングする必要があります。物事は、私は正確な順序で必要と重複を含む。前のドキュメントと同様に、同じexerciseへの3つのリンクが含まれており、私は3つの同じexerciseの配列を返す必要があります。

今、私はこのクエリを使用しています:

db.collection("exercises").find({_id: {$in: exercises.map(exid => ObjectID(exid)) }}).toArray() 

このクエリは、私が必要とするすべてのexerciseを返しますが、間違った順序で、重複なし。

MongoDBを使用して1つのクエリでこのような結果を達成できますか?このような

exercises.map(exid => db.collection("exercises").find({id: ObjectID(exid)}); 

何かは私が必要とする配列を与える必要がありますが、私は、これは正しい方法ではないと思います。私は(単なる一例として、それをテストしていない)私はそのような何かを行うことができますことを知っています個別のクエリを作成して特定のexerciseを取得します。

P.S.私はexercisesを文書そのものに格納することができますが、外部のexercisesコレクションは使用していませんが、programのものはexerciseを参照している可能性があります。

答えて

0

サーバーからexercisesのすべてのクエリを取得し、すべてのIDをこのアレイの値からサーバーにマップすることにしました。このクエリの

db.collection("exercises") 
    .find({_id: {$in: g.exercises.map(exid => ObjectID(exid)) }}) 
    .toArray() 
    .then(res => g.exercises.map(exid => res.find(exs => exs._id == exid))) 

説明:そのような

  • (MongoDBのの$in演算子を使用して)サーバから対応するIDを持つすべてのexercisesの配列を取得
  • がそれぞれのマップ配列に変換要素がg.exercisesの配列の要素への配列(res)IDは要求と同じです

これは、必要なすべてのデータを要求する1つのクエリです。

誰かを助けてくれることを願っています。

関連する問題