在MongoDB中另一个数组内的数组内部按特定值进行分组

时间:2015-01-27 15:17:27

标签: arrays mongodb mongodb-query

我正在尝试编写一个查询,通过MongoDB中集合内另一个数组内的数组内的值对记录进行分组。现在,如果没有你的头脑,我认为样本架构可能更容易理解:

{
    "_id": ObjectId("...")
    "attributes": [
        [ "attributeA", "valueA" ],
        [ "attributeB", "valueB" ],
        [ "attributeC", "valueC" ],
        ...
    ]
} 

现在我希望能够基于valueB通过attributeB字段对记录进行分组。

到目前为止,如果我知道valueB的实际值,我可以聚合:

collection.aggregate([
    { '$match': { 'attributes': [ "attributeB", "valueB" ] } },
    { '$group': {
        '_id': { 'attributes': [ "attributeB", "valueB" ] } } 
    }  
])

基本上查看属性数组是否包含对:[“attributeB”,“valueB”]。但现在我希望能够让查询确定执行聚合时的值是什么。

换句话说:如果我不知道valueB的值,我似乎无法弄清楚如何按值分组。我只是希望所有记录按其valueB分组,当在属性数组内的数组内的第一个位置找到attributeB时。

感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:1)

对数据进行分组后,您应该使用$unwind运算符。它将您的其他字段与数组中的每个项目配对。

collection.aggregate([
  { '$match': { 'attributes': [ "attributeB", "valueB" ] } },
  { '$group': {
      '_id': { 'attributes': [ "attributeB", "valueB" ] } } 
  },
  { '$unwind':  'attributes'},
    ... // here you can match again and continue aggregation
]) 

很可能这不是最快的解决方案。我会想到一个更好的。

另请注意,不保留数组中元素的顺序。

<强> 更新

这是一个类似的question。所以我要做的是在属性数组中创建文档,如

'attributes':[
   {'attribute': 'attributeB', 'value': 'valueB'},
   {'attribute': 'attributeC', 'value': 'valueA'},
]

因此,您可以在valueB$match$unwind之后访问$value