2017-07-04 10 views
0

だから、私は人々のコレクションにこれらの文書を持っている:MongoDBクエリでドキュメントの配列をフィルタリングしてマップする方法は?

{ 
     "_id" : ObjectId("595c0630939a8ae59053a9c3"), 
     "name" : "John Smith", 
     "age" : 37, 
     "location" : "San Francisco, CA", 
     "hobbies" : [ 
       { 
         "name" : "Cooking", 
         "type" : "Indoor", 
         "regular" : true 
       }, 
       { 
         "name" : "Baseball", 
         "type" : "Outdoor", 
         "regular" : false 
       } 
     ] 
} 
{ 
     "_id" : ObjectId("595c06b7939a8ae59053a9c4"), 
     "name" : "Miranda Thompson", 
     "age" : 26, 
     "location" : "Modesto, CA", 
     "hobbies" : [ 
       { 
         "name" : "Lego building", 
         "type" : "Indoor", 
         "regular" : false 
       }, 
       { 
         "name" : "Yoga", 
         "type" : "Indoor", 
         "regular" : false 
       } 
     ] 
} 
{ 
     "_id" : ObjectId("595c078e939a8ae59053a9c5"), 
     "name" : "Shelly Simon", 
     "age" : 26, 
     "location" : "Salt Lake City, UT", 
     "hobbies" : [ 
       { 
         "name" : "Hunting", 
         "type" : "Outdoor", 
         "regular" : false 
       }, 
       { 
         "name" : "Soccer", 
         "type" : "Outdoor", 
         "regular" : true 
       } 
     ] 
} 

私は唯一の定期的な趣味に私の「趣味」の配列をフィルタリングしようとすると_idフィールド、名前、年齢、趣味の名前とタイプを投影しています。

私は私の出力はこのような何かになりたい:私は、あなたが見ることができるように

db.people.aggregate([ 
    { 
     $project: { 
      hobbies: { 
       $filter: { 
        input: "$hobbies", 
        as: "hobby", 
        cond: { $eq: ["$$hobby.regular", true] } 
       } 
      }, 
      name: 1, 
      age: 1 
     } 
    }, 
    { 
     $project: { 
      "hobbies.name": 1, 
      "hobbies.type": 1, 
      name: 1, 
      age: 1 
     } 
    } 
]) 

{ 
     "_id" : ObjectId("595c0630939a8ae59053a9c3"), 
     "name" : "John Smith", 
     "age" : 37, 
     "hobbies" : [ 
       { 
         "name" : "Cooking", 
         "type" : "Indoor" 
       } 
     ] 
} 
{ 
     "_id" : ObjectId("595c06b7939a8ae59053a9c4"), 
     "name" : "Miranda Thompson", 
     "age" : 26, 
     "hobbies" : [] 
} 
{ 
     "_id" : ObjectId("595c078e939a8ae59053a9c5"), 
     "name" : "Shelly Simon", 
     "age" : 26, 
     "hobbies" : [ 
       { 
         "name" : "Soccer", 
         "type" : "Outdoor" 
       } 
     ] 
} 

うーん...私はモンゴシェルで次のコマンドを使用して、この出力を達成することができます2つの$プロジェクト演算子を順番に使用しなければならず、これは悪いと思う。

同じ演算子を2回連続して使用しない別のクエリで同じ結果を得る方法はありますか?

答えて

2

内の$filter式をラップして出力値をマップできます。

db.people.aggregate([ 
    { 
    "$project": { 
     "name": 1, 
     "age": 1, 
     "hobbies": { 
     "$map": { 
      "input": { 
      "$filter": { 
       "input": "$hobbies", 
       "as": "hobbyf", 
       "cond": "$$hobbyf.regular" 
      } 
      }, 
      "as": "hobbym", 
      "in": { 
      "name": "$$hobbym.name", 
      "type": "$$hobbym.type" 
      } 
     } 
     } 
    } 
    } 
]) 
関連する問題