Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
$avg在MongoDb查询中不返回值_Mongodb_Mongodb Query_Aggregation Framework_Monk_Mongodb Aggregation - Fatal编程技术网

$avg在MongoDb查询中不返回值

$avg在MongoDb查询中不返回值,mongodb,mongodb-query,aggregation-framework,monk,mongodb-aggregation,Mongodb,Mongodb Query,Aggregation Framework,Monk,Mongodb Aggregation,我正在和NodeJs和MongoDb合作研究Raspbian。我用蒙克当司机。 数据库中的文档如下所示: var data = { ga : id, // Group address format (string) val : val, // raw value (float) ts : now // JavaScript time stamp } 我使用以下代码检索分组和聚合数据: const dbRawColl = req.db.get('

我正在和NodeJs和MongoDb合作研究Raspbian。我用蒙克当司机。 数据库中的文档如下所示:

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,因为在DB中大约有50000个样本,值的范围很大(从10到30)

附带问题:“min”和“max”为什么会返回字符串?在查看样本时,该值本身对我来说是有效的

OS、Node、Express和MongoDb都是截至2016年8月的最新版本

编辑以回答问题,这是一个典型的文档:

{
  ga  : "0/7/71",     // Group address format (string)
  val : "24.45",      // raw value (float)
  ts  : 12345678909   // JavaScript time stamp
}

该值显然是一个字符串。有些值是实际字符串,因此将“全部”转换为“数字”将不起作用。但是对于我使用$match请求的字段,可以保证这些值可以转换为数字。

$avg
将只处理数字类型的值,而不是字符串。要使
$min
$max
以“数字”方式工作,值也必须是数字类型。总之,您需要将所有
val
值转换为实际数字,而不是字符串。
$avg
仅适用于数字类型的值,而不是字符串。要使
$min
$max
以“数字”方式工作,值也必须是数字类型。总之,您需要将所有
val
值转换为实际数字,而不是字符串。