$ avg在MongoDb查询中不返回任何值

时间:2016-08-20 15:01:46

标签: mongodb mongodb-query aggregation-framework monk mongodb-aggregation

我在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"返回正确的结果什么阻止" $ 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
}

该值显然是一个字符串。某些值是实际字符串,因此将all转换为数字将不起作用。但是对于我用$ match匹配的字段,我们保证这些值可以转换为Number。

0 个答案:

没有答案