猫鼬聚合 - $减去日期

Mongoose aggregate - $subtract dates

我在尝试减去两个日期以获得毫秒数差异时遇到了 Mongoose 聚合问题。

文档结构如下:

DeliverySchema = new mongoose.Schema({
  hash: String,
  status: Number,
  insertedOn: {
    type: Date,
    default: Date.now
  },
  endedOn: {
    type: Date
  }
}, {
  collection: 'Deliveries'
});

这是查询:

var Delivery = mongoose.model('Delivery');

return Delivery.aggregate([
    {
      $match: {
        'insertedOn': {$ne: null, $type: 9},
        'endedOn': {$ne: null, $type: 9}
      }
    },
    {$project: {duration: {$subtract: ["$endedOn", "$insertedOn"]}}},
    {
      $group: {
        _id: {
          day: {$dayOfMonth: "$insertedOn"},
          month: {$month: "$insertedOn"},
          year: {$year: "$insertedOn"}
        },
        count: {$sum: 1},
        durationAvg: {$avg: "$duration"}
      }
    },
    {$sort: {"_id.year": 1, "_id.month": 1, "_id.day": 1}}
  ])

这是我遇到的错误:

error: exception: can't convert from BSON type EOO to Date

$match 阶段应该过滤所有 insertedOn/endedOn 字段为空或非日期的文档,但它似乎没有用。我被卡住了,有人有任何线索吗? 我将 Mongoose 4.0.1(mongod 2.6.9 托管在 Mongolab 上)与 Node 0.10.33 一起使用。 谢谢

谢谢。

您的 $project 阶段的输出是仅包含计算的 duration 字段的文档。您还需要包括 insertedOnendedOn 字段,以便它们可用于随后的 $group 阶段:

{$project: {
    duration: {$subtract: ["$endedOn", "$insertedOn"]},
    endedOn: 1,
    insertedOn: 1
}}