2017-07-10 15 views
0

mongo v3.4.4を使用しています
どのようにして配列のオブジェクトを取得しますか?私は必要なもの
コレクションサンプルMongoの配列からオブジェクトを取得する方法

{ 
    name: earth 
    age: 12 
    cars : [ 
     { 
      brand : tesla 
      color : red 
      time : 123 
     }, 
     { 
      brand : toyota 
      color : black 
      time : 124 
     }, 
    ] 

}, 
{ 
    name: mars 
    age: 15 
    cars : [ 
     { 
      brand : volvo 
      color : green 
      time : 125 
     }, 
     { 
      brand : honda 
      color : blue 
      time : 126 
     }, 
    ] 
} 

はわずかです:

{ 
    brand : tesla 
    color : red 
    time : 123 
} 

私が試してみました:

db.users.aggregate([ 
    { 
     $match:{"name":"earth"} 
    }, 
    { 
     $project: 
      {"cars": 
       {"$filter": 
        { 
         input:"$cars", 
         as:"cars", 
         condition: "{$eq:[ $$cars.brand :"tesla"]}" 
         } 
       } 
      } 
     } 
]) 

しかし、私はまだ私が期待される出力が表示されません。フィルターを正しく使用していないかどうかはわかりません。 cars配列にオブジェクトが1つしかない場合は、そのオブジェクトを1つだけ返します。集計クエリ以下

db.users.aggregate([ 
{$match: {name:"earth"}}, 
{$unwind: "$cars"}, 
{$replaceRoot: {newRoot: "$cars"}}, 
{$match: {brand:"tesla"}} 
]); 
+1

で、クエリ

db.users.find({ "name":"earth" }, { "cars" : { "$elemMatch" : { "name" : "tesla }}}) 

の下に使用しており、出力は次のようになります一致。 "all"を読んだ場合、答えは '.find({" name ":" earth "、" cars.brand ":" tesla "}、{" brand。$ ":1})'になります。同じことを返すそれは "あなたが欲しいものではない"として、それに慣れてください!あなたは結局、ドキュメントを最初に配列に埋め込むことを決めた人物です。一致する埋め込みドキュメントだけを検索するだけの場合は、代わりに別のコレクションに配置する必要があります。それはできますか?はい。あなたはそれをしなければなりませんか?いいえ。データと一致してコード内の項目を抽出するだけです –

答えて

1

を見てきました 集計を使用する代わりに、標準によって達成することができます味方

{ 
    "cars" : [ 
    { 
     brand : tesla 
     color : red 
     time : 123 
    }] 
} 

集約あなたは「シングル」はこちら$ filter` `必要はありません、常にコストのかかる操作

1

用途:

db.users.aggregate({$match:{name:'earth'}},{$unwind:"$cars"},{$match:{"cars.name":'tesla'}},{$project:{"cars":"$cars",_id: 0}}); 

結果は、この

{ "cars" : { "name" : "tesla", "color" : "red" } } 
1

ように私だろう、私はあなたが以下のアグリゲーションパイプラインを使用することができ、このexample

関連する問題