arrays - 仅聚合 MongoDB 文档中数组的现有元素
问题描述
我将数据存储在 mongodb 文档集合中,如下所示。
{"_id":1536921044022.3953,
"flow":[
{"_id":1536921044279.358,"y":0.1,"i":375,"t":33.1},
{"_id":1536921044914.2346,"y":0.2,"i":310,"t":40.9},
{"_id":1536921045548.5076,"y":0.3,"i":408,"t":32.9}],
"__v":0}
{"_id":1536921044053.3254,
"flow":[
{"_id":1536921044229.358,"y":0.4,"i":375,"t":33.1},
{"_id":1536921044954.2346,"y":0.5,"i":310,"t":40.9},
{"_id":1536921045514.506,"y":0.6,"i":408,"t":32.9}],
{"_id":1536921045245.5056,"y":0.7,"i":408,"t":32.9}],
{"_id":1536921045549.3076,"y":0.8,"i":408,"t":32.9}],
"__v":0}
我想聚合流场中的数据,以便获得一个数组,该数组表示$flow.y
每个相应元素的值的平均数据点。鉴于上面的数据,结果应该是[0.25, 0.35, 0.45, 0.7, 0.8]
。请注意,y
流数组的每个可用字段已在所有文档中平均。第二个文档的最后两个元素返回为0.7
,0.8
因为它们在前一个中不存在。因此,现有条目的平均值只是这两个值,而不是0.35
您0.4
可能期望的那样。如果有第三个文档,0.12, 0.13
则返回的元素将是0.41
and 0.465
。
我一直在尝试组合$arrayElemAt
, $elemMatch
,$avg
作为聚合管道的一部分,但我似乎无法找到正确的语法。
这是我到目前为止的进展(nodejs):
for (i=0;i<10;i++) {
ModelName.aggregate([
{ $project: { pulse: { $objectToArray: { $arrayElemAt: ["$flow", i]} } } },
{ $unwind: "$pulse" },
{ $match: { "pulse.k": "y" }},
{ $group: { _id: "$pulse.k",
count: { $sum: 1 },
average: { $avg: "$pulse.v" },
total: { $sum: "$pulse.v" }}}
], function (err, result) {
console.log(err, result);
running.push(result[0].average);
});
};
它将返回y
每个文档的每个子文档元素的字段的平均值。所以它到了那里。剩下的关键障碍是删除循环并否定没有匹配元素的数组。我想要完成后者,我必须保持现有数组元素的运行计数并除以每个平均值。
解决方案
您可以将$unwind与includeArrayIndex
选项一起使用,该选项将为您提供初始数组中的顺序,您可以$group
通过该值尝试:
db.model.aggregate([
{
$unwind: {
path: "$flow",
includeArrayIndex: "index"
}
},
{
$group: {
_id: "$index",
value: { $avg: "$flow.y" }
}
},
{
$sort: { _id: 1 }
},
{
$group: {
_id: null,
values: { $push: "$value" }
}
}
])
输出:{ "_id" : null, "values" : [ 0.25, 0.35, 0.44999999999999996, 0.7, 0.8 ] }
推荐阅读
- pac4j - renewSession 在 pac4j 中做了什么?
- angular - Angular:主页在加载不同的路由之前渲染了一秒钟,即使我删除了主页组件模板的内容
- woocommerce - Woocommerce - 在订单电子邮件的标题旁边显示特定的产品属性值
- jquery - 如果在 ajax 中返回 false,如何停止运行我的代码
- vhdl - VHDL:[Place 30-574] IO 引脚和 BUFG 之间的布线布局不佳
- django - 我应该如何编写一个序列化程序,其中外键由 SlugRelatedField 或外键序列化程序设置?
- reactjs - 如何在材质 ui 中管理脏状态?
- amazon-web-services - AWS Glue Python Shell 导入 H3
- gis - 如何在 openlayers 的地图上显示全球 UTM 网格?
- r - 使用 dplyr(nycflights 数据)在 R 中排列数据时遇到问题