我正在尝试编写一个查询,通过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时。
感谢任何帮助。谢谢!
答案 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
。