MongoDB聚合查询$ match不返回日期范围,为什么?

时间:2014-03-31 07:53:25

标签: javascript node.js mongodb express mongoose

我无法获得以下MongoDB聚合查询以返回结果。它只返回一个空数组。我相信这是因为它没有正确处理日期范围。但是,当我执行PriceHourly.find({ date: { $lt: end, $gt: start }})时,会按预期返回记录...

    var start       = moment.utc('03-02-2012').startOf('day');
    var end         = moment.utc('03-02-2012').add('days',1).startOf('day');

    PriceHourly.aggregate([
        { $match: { date: { $gt: start, $lt: end } } },
        { $group: { _id: null, avgPrice: { $avg: '$price' } } }

    ], function(err, results){
        console.log(err, results);
    });

// Model
var PriceHourlySchema = new Schema({
    created: {
        type: Date,
        default: Date.now
    },
    full_date: {
        type: String,
        required: true,
        trim: true
    },
    day: {
        type: String,
        required: true,
        trim: true
    },
    hour: {
        type: String,
        required: true,
        trim: true
    },
    price: {
        type: Number,
        required: true
    },
    date: {
        type: Date,
        required: true
    }
}, 
{ 
    autoIndex: true 
});

1 个答案:

答案 0 :(得分:0)

MongoDB聚合框架的$ match不了解我提交的Moment Date对象。 $ match似乎只适用于本机Javascript日期对象。因此,如果您仍然希望将Moment.js与$ match一起使用,只需使用Moment的toDate()方法将Moment.js日期对象转换为本机Javascript日期对象,如下所示:

var start       = moment.utc(req.query.start).startOf('year').toDate();
var end         = moment.utc(req.query.start).add('years',1).startOf('year').add('hours',1).toDate();