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

MongoDB Aggregation Query $match returns nothing with date range, why?

本文关键字:日期 任何 范围 为什么 返回 查询 match MongoDB      更新时间:2023-09-26

我无法让以下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 
});

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

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();