2016-12-27 11 views
0

ルートドキュメントなしでコレクションのフィールド(配列)からすべての埋め込みドキュメントを選択する方法はありますか?このコレクションMongoDBルート以外の基準ですべての埋め込みドキュメントを選択

{ "_id" : 1, "cars" : [{"brand": "audi", "color": "red"}, {"brand": "audi", "color": "yellow"}]} 
{ "_id" : 2, "cars" : [{"brand": "audi", "color": "blue"}, {"brand": "seat"}]} 

与え例えば、私はそれだけでdb.collection.find()projectionと、そのマッチング基準で可能であるように思われません、次のような出力

{"brand": "audi", "color": "red"} 
{"brand": "audi", "color": "blue"} 
{"brand": "audi", "color": "yellow"} 

を持つブランドaudiですべての車を選択したいと思います常にルートドキュメントに関連しています。

あなたがその意志集約使用することができます
+0

@SagarReddyブランド= 'audi'と一致する車が少なくとも1台あるすべてのルートオブジェクトを選択します。しかし、例えば、2番目の文書の1台の '座席'の車が間違って含まれることになります。 –

+0

'db.collection.find({'carss.brand': 'audi'}、{'cars。$':1})' – styvane

+0

@Styvaneこれは最初に一致するレコードのみを取得します。私はOPにはすべての一致するエントリが必要だと思います。 – Veeram

答えて

-1

:あなたは出力 を再編成するために、重複

  • $projectを削除するブランド&色で車配列
  • $matchのみアウディbrand
  • $group

    • $unwind

      クエリは次のとおりです。あなたが後にあるものを達成するために$replaceRoot演算子を使用することができますMongoの3.4バージョンで

      db.cars.aggregate([{ 
          $unwind: '$cars' 
      }, { 
          $match: { 
           'cars.brand': 'audi' 
          } 
      }, { 
          $group: { 
           '_id': { 'brand': '$cars.brand', 'color': '$cars.color' } 
          } 
      }, { 
          $project: { 
           _id: 0, 
           'brand': '$_id.brand', 
           'color': '$_id.color' 
          } 
      }]) 
      
  • +0

    ネストされた埋め込みドキュメントのために$ unwindをネストできますか? –

    +0

    ネストされた配列をルートの後ろに巻き戻すことができます: 'db.cars.aggregate({$ unwind: '$ topArray'}、{$ unwind: '$ topArray.cars'}])' –

    0

    db.cars.aggregate([{ 
        $unwind: "$cars" 
    }, { 
        $match: { 
         "cars.brand": "audi" 
        } 
    }, { 
        $replaceRoot: { 
         newRoot: "$cars" 
        } 
    }]) 
    
    関連する問題