2017-01-24 9 views
2

MongoDBの配列から要素を取得しようとしています。私は、集約フィルタが適用するのが正しいと思います。しかし、何百万回も試してみましたが、どこに問題があるのか​​まだ分かりません。私に手を差し伸べてもらえますか?サブディレクトリ配列フィールドのフィルタ配列

MongoDBのサンプルデータ:

{ 
    "_id" : 12, 
    "items" : [ 
      { 
        "columns" : [ 
          { 
            "title" : "hhh", 
            "value" : 10 
          }, 
          { 
            "title" : "hahaha", 
            "value" : 20 
          } 
        ] 
      }, 
      { 
        "columns" : [ 
          { 
            "title" : "hiii", 
            "value" : 50 
          } 
        ] 
      } 
    ] 
} 

私のソリューション:

db.myCollection.aggregate([ 
    { 
     $project: { 
     items: { 
      $filter: { 
       input: "$items", 
       as: "item", 
       cond: { $eq: [ "$$item.columns.title", "hahaha" ]} 
      } 
     } 
     } 
    } 
]).pretty() 

マイ結果:

{ 
    "_id" : 15, 
    "items" : [ 
      { 
        "columns" : [ ] 
      }, 
      { 
        "columns" : [ ] 
      } 
    ] 
} 

期待される結果:

{ 
    "_id" : 15, 
    "items" : [ 
      { 
        "columns" : [ 
          { 
            "title" : "hahaha", 
            "value" : 20 
          } 
        ] 
      }, 
      { 
        "columns" : [] 
      } 
    ] 
} 

私はMongoの参照をチェックしています https://docs.mongodb.com/manual/reference/operator/aggregation/filter/#example

MongoDBのバージョン:3.4.1
テスト環境:あなたがサブ文書内のサブ配列を$filterする$map配列演算子を使用する必要がモンゴシェル

答えて

2

。また、必要に応じて、$addFieldsアグリゲーションパイプラインステージでこれを実行して、他のすべてのフィールドをクエリ結果に自動的に含める必要があります。

ステージを$projectに変更することもできますが、この場合は他のすべてのフィールドを明示的に含める必要があります。

let value = "hahaha"; 

db.coll.aggregate([ 
    { 
     "$addFields": { 
      "items": { 
       "$map": { 
        "input": "$items", 
        "as": "item", 
        "in": { 
         "columns": { 
          "$filter": { 
           "input": "$$item.columns", 
           "as": "elt", 
           "cond": { "$eq": [ "$$elt.title", value ] } 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
]) 
関連する問題