$ match _id在Mongoose聚合函数中不起作用

时间:2017-03-27 16:53:58

标签: node.js mongodb mongoose

作为我的标题,$ match _id在Mongoose聚合函数中不起作用。 有人可以帮帮我吗? 这与猫鼬版有关吗? 我用4.9.2。 我需要使用聚合,因为我将在处理$ match后按结果进行分组。 我之前已经看过帖子了,但手动播放并不适合我!

这是我的架构:

var mongoose = require("mongoose");
var moment = require("moment");
var Schema = mongoose.Schema;


var AvgDailyCharging = new Schema({
    _id : {
        date: Date,
        storeID: {
            type: Schema.Types.ObjectId,
            ref: 'store'
        }
    },
    chargers: [{ 
        transmitterID: {
            type: Schema.Types.ObjectId,
            ref: 'device'
        }, 
        minutes: Number
    }],
});

mongoose.model('AvgDailyCharging', AvgDailyCharging);

以下是查询:

var Mongoose = require('mongoose');
var Model = require('../db/model');
var Query = require('../db/query');

var RESULT_LIMIT = 2000;  // Limit the return data size

exports.getAvgDailyCharging = function(req, res) {
    var id = new Mongoose.Types.ObjectId("58b43fdf0fd53910121ca6f4");
    var query = new Query("AvgDailyCharging");
    query.aggregate([
        { 
            $match: { 
                "_id.storeID": id, //HELP!!!!!
                "_id.date": { //match only by this works fine.
                    $gte: new Date(req.params.startTime),
                    $lt: new Date(req.params.endTime)
                }
            }
        }
    ]).exec(function(error, data) {
        if (error) {
            res.send({result:'ERROR', message: error});
        } else {
            res.send(data);
        }   
    });
}

请帮帮我!!!!我被困了几个小时! Q_Q

1 个答案:

答案 0 :(得分:1)

当我在mongoose版本4.4.4中进行测试时,类型转换和字符串都不起作用。但是,在我将其更新到版本4.9.2后,不需要输入类型,并直接使用$ match _id中的字符串工作!

<强>更新:2017年3月31日

我认为我的场景中的另一个问题是我的架构定义。由于此集合(例如A)是使用$group: { _id: { storeID: "$storeID" } }从另一个集合(例如B)创建的,其中集合B中的storeID字段的类型为ObjectId,然后在集合AI中找到_id.store实际上是String而不是ObjectId,所以最好的方法是将我在问题中提到的架构更改为:

var AvgDailyCharging = new Schema({
    _id : {
        date: Date,
        storeID: String
    },
    chargers: [{ 
        transmitterID: {
            type: Schema.Types.ObjectId,
            ref: 'device'
        }, 
        minutes: Number
    }],
});