我在 Raspbian 上使用 NodeJs 和 MongoDb。我用和尚当司机。我在数据库中有如下所示的文档:
var data = {
ga : id, // Group address format (string)
val : val, // raw value (float)
ts : now // JavaScript time stamp
}
我正在使用此代码来检索分组和聚合数据:
const dbRawColl = req.db.get('raw'); // this is the collection
var project = {
$project:{
_id: 0,
d: { $add: [ new Date(0), "$ts" ] },
v: "$val"
}
};
// filter by (this works)
var match = { $match: { 'ga': '0/7/71' } };
// group results
var group = {
$group: {
_id: { day: { $dayOfMonth: '$d' } },
min: { $min: '$v' },
max: { $max: '$v' },
avg: { $avg: '$v' },
count: { $sum: 1 }
}
};
dbRawColl.aggregate([ match, project, group ], function(e, docs) {
// send "docs" here
}
该查询有效,我每天都会看到许多分组结果。我得到的答案看起来像这样
[{ "_id": { "day": 20 },
"min": "16.38",
"max": "29.64",
"avg": 0,
"count": 2687},
... more results omitted for clarity
]
问题是:为什么“min”和“max”返回正确的结果,而“$avg”总是 0。是什么阻止了“$avg”的工作。它几乎不是 0,因为数据库中有大约 50000 个样本,值范围很广(从 10 到 30)。
附带问题:为什么“min”和“max”会返回字符串?在查看样本时,该值本身对我来说似乎是有效的。
OS、Node、Express、MongoDb 都是截至 8/2016 的当前版本。
编辑回答问题,这是一个典型的文件:
{
ga : "0/7/71", // Group address format (string)
val : "24.45", // raw value (float)
ts : 12345678909 // JavaScript time stamp
}
该值显然是一个字符串。有些值是实际的字符串,因此将所有值转换为数字将不起作用。但是对于我使用 $match 要求的字段,可以保证这些值可以转换为数字。