猫鼬聚合 - $减去日期

时间:2015-04-21 08:49:15

标签: node.js mongodb mongoose

我试图减去两个日期以获得差异毫秒时,我在使用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阶段应该过滤所有insertOn / endedOn字段为null或非Date的文档,但它似乎没用。我被卡住了,有人有任何线索吗? 我使用Mongoose 4.0.1(Mongolab上托管的mongod 2.6.9)和节点0.10.33。 感谢

感谢。

1 个答案:

答案 0 :(得分:2)

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

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