万一有人感兴趣,这是我想出的解决方案。由于 mongodb 的一些限制,我花了一段时间才弄清楚,但它工作得很好,比我当前的 map reduce 解决方案快 10 倍。
这是聚合代码:
db.data.aggregate(
{$match: {$and: [{graph_id: gid}, {"x.value": {$gt: start, $lt: stop}}]}},
{$project: {x: 1, y: 1, series: 1, chunk: {$subtract: [{$divide: ["$x.value", step]}, {$mod: [{$divide: ["$x.value", step]}, 1]}]}}},
{$group: {
_id: {
chunk: "$chunk",
series: "$series"
},
series: {$first: "$series"},
x: {$first: "$x"},
y: {$first: "$y"},
}
},
{$sort: {"x.value": 1}}
)
此解决方案将数据分块。我想做一些类似 int(x.value / step) 的事情,但是 mongodb 没有整数数学运算符。所以我不得不用 ((x.value/step) - ((x.value/step) % 1)) 来伪造它,这给了你除法的整数部分。
这很有效,并且可以让你做一些事情,比如平均块,而不是仅仅选择第一个,很容易。