【发布时间】:2015-03-21 03:20:44
【问题描述】:
我有一个数据集如下:
{
item: '123',
array: [{
array2:[{
array3: [{
property1: 1234
}]
}],
anotherArray: [{
property2: 1234
}]
}]
}
我试图在同一个请求中聚合属性 2 和属性 1 的总和。 这是我当前的聚合函数:
Item.aggregate([
{$match: {itemId: 1234}},
{$unwind: "$array"},
{$unwind: "$array.array2"},
{$unwind: "$array.array2.array3"},
{$unwind: "$array.anotherArray"},
{$group: {
_id: 0,
property1: {$sum: '$array.array2.array3.property1'},
property2: {$sum: '$array.anotherArray.property2'}
}},
{$project: {
_id: 0,
property1: "$property1",
property2: "$property2",
}},
], function (err, aggregate) {
callback(null, aggregate);
});
问题是属性 1 和 2 的聚合结果始终是它们应有的值的两倍。
我猜问题出在“anotherArray”的 $unwind 上,因为当我删除它时,我得到了正确的聚合值。
是否可以用一个聚合函数对多个数组进行聚合?
目前我只是通过异步并行向数据库发出 2 个不同的请求,但我想在未来进行更复杂的聚合而不进行额外的数据库调用。
【问题讨论】:
-
嵌套数组是一个非常糟糕的想法
-
我有一个具有预定义结构的非常复杂的数据集,我无法更改太多。所以这里不可能不使用嵌套数组...
-
如果您打算查询或聚合它们,它们确实是一个非常糟糕的主意,尤其是像这样嵌套的乘法。您能否至少向我们解释一下这些数据意味着什么以及为什么它需要处于这样一个可疑的结构中?总和的意义是什么?我们能否制作一个具有不同结构和部分数据的辅助集合,并用它来计算总和?
标签: node.js mongodb mongoose mongodb-query aggregation-framework