2017-10-04 91 views
1

我有一个内部包含产品(对象)的数组。它看起来像:我应该怎么做一个聚合?

[ 
{_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'} 
]} 
] 

从客户

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

请求我应该怎么做蒙戈合计获得具有品牌=“Eleaf” 和颜色的产品=红色根据要求?

有人可以帮忙吗?

+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,则答案正确。要做到同样的事情在一个聚合管道,使用$match,如:

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

然后,您可以添加到阵列中,你需要任何额外的流水线阶段。

+0

谢谢,似乎它工作=) –