2017-10-04 7 views
1

私は内部に製品(オブジェクト)を持つ配列を持っています。私は要求に応じて赤=「Eleaf」 と色のブランドを持っている製品を=取得するモンゴで集計を行う必要がありますどのように 集計はどのように行うべきですか?

{category:'Vape', body:{brand:'Eleaf', color:'red'}} 

クライアント

から

[ 
{_id: 123, name:'first', category:'Vape', property:[ 
    {key:'brand', values:'Eleaf'}, 
    {key:'mechmode', values:'some'}, 
    {key:'color', values:['red', 'blue']}, 
    {key:'batrtype', values:'some2'}, 
]}, 
{_id: 1234, name:'second', category:'Vape1', property:[ 
    {key:'brand', values:'Eleaf1'}, 
    {key:'mechmode', values:'some'}, 
    {key:'color', values:['black']}, 
    {key:'batrtype', values:'some2'} 
]}, 
{_id: 12345, name:'third', category:'Vape3', property:[ 
    {key:'brand', values:'Eleaf3'}, 
    {key:'mechmode', values:'some'}, 
    {key:'color', values:['green', 'yellow']}, 
    {key:'batrtype', values:'some2'} 
]}, 
{_id: 123456, name:'fourth', category:'Vape', property:[ 
    {key:'brand', values:'Eleaf'}, 
    {key:'mechmode', values:'some'}, 
    {key:'color', values:['red', 'green']}, 
    {key:'batrtype', values:'some2'} 
]} 
] 

要求:それはのように見えますか?

誰か助けてもらえますか?

+0

この配列はドキュメント内の単一のフィールドとして格納されているのですか、それともコレクション内のドキュメントのリストですか? – Joe

+0

コレクション内の文書のリストです –

答えて

0

私は、これはトリックを行うべきだと思う:

db.products.find({ 
    category: "Vape", 
    $and: [ 
     { property: { $elemMatch: { key: "brand", value: "Eleaf1" }, 
     { property: { $elemMatch: { key: "color", value: "red" } 
    ]}) 

私はあなたのデータの構造がベストプラクティスであるかわかりません。キーと値のペアではなく、「色」の値を持つ「ブランド」というフィールドの場合は、より簡単なことがあります。

1

bgrahamの回答は、あなたがfindを使用している場合はまさに正しいです。あなたは、その後、アレイに必要な追加のパイプラインステージを追加することができます

db.aggregate([{$match:{ 
    category: "Vape", 
    $and: [ 
    { property: { $elemMatch: { key: "brand", value: "Eleaf" }, 
    { property: { $elemMatch: { key: "color", value: "red" } 
    ] 
}}]) 

:アグリゲーションパイプラインで同じことを行うには、のような、$matchを使用しています。

+0

ありがとう、それは働くようです=) –

関連する問題