2017-08-03 16 views
2

Mongoの配列から特定のフィールドを返したいと思っています。Mongo:配列スライスから特定のフィールドを返す

私たちは、このようなのような文書があるとしましょう:

{ 
    "student":"Bob", 
    "report_cards": [ 
    { 
     "Year":2016, 
     "English":"B", 
     "Math":"A" 
    }, 
    { 
     "Year":2015, 
     "English":"B", 
     "Math":"A" 
    } 
    ] 
} 

私は次のように返したい:

{"Student": "Bob", {"English":"B"}} 

基本的に、私は唯一のレポートカードの配列の最初の要素を必要とし、英語のフィールドのみを返します。

私はそれが周りに何か知っている:

db.collection.find({},{"Student":1, "report_cards":{$slice:1}}); 

しかし、これは、もちろん、完全な配列(年、英語、数学)の結果は返します。私は以下を試しました:

db.collection.find({},{"Student":1, "report_cards.$.english":{$slice:1}}) 
db.collection.find({},{"Student":1, "report_cards":{$slice:1, "$.english"}}); 

しかし、それらは正しくありません。

配列結果内のobjから1つのフィールドを返すだけですか?

ありがとうございました!埋め込まれた文書で、キーと値のペアをフィルタリングするための組み込みの演算子がありません私の知る限り

答えて

2

あなたは

db.test.aggregate 
([{$project:{_id:0, 
student:'$student', 
English:{ $arrayElemAt: ['$report_cards.English',0] 
}}}]) 
1

としての値を取得するために集約フレームワークを使用することができます。

最新の3.4バージョンで達成するために演算子の組み合わせを使用することができます。

バックに変換するために一致するキー値ペアと$arrayToObjectを維持するEnglishキーにアレイビュー(kvペアのアレイ)と$filterに変換し$objectToArray続いreport_cardsの最初の要素を取得するために以下のクエリ使用$arrayElemAt資料。

何か

よう
{ 
    "$project": { 
    "output": { 
     "$arrayToObject": { 
     "input": { 
      "$filter": { 
      "input": { 
       "$objectToArray": { 
       "$arrayElemAt": [ 
        "$report_cards", 
        0 
       ] 
       } 
      }, 
      "as": "result", 
      "cond": { 
       "$eq": [ 
       "$$result.k", 
       "English" 
       ] 
      } 
      } 
     } 
     } 
    } 
    } 
} 
関連する問題