2017-03-14 9 views
7

は、私は私のtaxonコレクションはで次のスキーマを持っています。MongoDBの再帰クエリ

私は次のような結果を得るために再帰検索を実行したいと思います:_id: 1とドキュメントまで、それぞれの親のna配列の最初の項目を取得し、_id特定した文書から

{ "_id": 4, 
    "nameList": [ "otherName_1", 
       "name_1", 
       "root_1"] 
} 

を到達しました

私は現在、Xクエリ(親文書で1つ、ここでは3つ)を実行してこの結果を得ていますが、これは単一のq uery。私は既に新しい$graphLookup演算子を見ていましたが、それを使って私の道を得ることができませんでした...

MongoDB 3.4.1を使用してこれを単一のクエリで実現できますか?

編集

私が最適解とは、例えば、単一のクエリ

のすべてを組み合わせることであろうので、それは希望が

var listId = [ 4, 128, 553, 2728, ...]; 
var cursor = db.taxon.aggregate([ 
    {$match: 
    { _id: {$in: listId}} 
    }, ... 
)]; 
のように見え、50の文書たびにこれを実行します

となります。

[{ "_id": 4, 
    "nameList": [ "otherName_1", 
       "name_1", 
       "root_1"] 
}, { "_id": 128, 
    "nameList": [ "some_other_ame_1", 
       "some_name_1", 
       "root_1"] 
}, { "_id": 553, 
    "nameList": [ "last_other_ame_1", 
       "last_name_1", 
       "root_1"] 
} ... ] 

答えて

4

以下の集計を試すことができます。

ステージ$match - $graphLookup - $project

$reduce$graphLookupnameList'snaアレイのそれぞれから最初の要素を選択します。

db.taxon.aggregate([{ 
    $match: { 
     _id: { 
      $in: listId 
     } 
    } 
}, { 
    $graphLookup: { 
     from: "taxon", 
     startWith: "$_id", 
     connectFromField: "pa", 
     connectToField: "_id", 
     as: "nameList" 
    } 
}, { 
    $project: { 
     nameList: { 
      $reduce: { 
       input: "$nameList", 
       initialValue: [], 
       in: { 
        "$concatArrays": ["$$value", { 
         $slice: ["$$this.na", 1] 
        }] 
       } 
      } 
     } 
    } 
}]) 
+0

これは非常に素晴らしいソリューションです、ありがとうございます!同じ時間にいくつかの文書を作成することは可能でしょうか? (詳細は私の編集を参照してください) – felix

+0

あなたは大歓迎です。更新された答え。一致する条件で動作するはずです。 – Veeram

+0

私は$で試してみましたが、カーソルを反復するのを忘れました...これはまさに私が必要としているもので、実際のゲインを見るためにいくつかのパフォーマンステストを実行する必要があります!あなたはそのようなクエリのためのインデックスについて助言していますか? – felix