Node.js MongoError:无法从缺少的BSON类型转换为日期

Node.js MongoError:无法从缺少的BSON类型转换为日期,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我正在使用Mongoose4.5.0并尝试使用聚合获取数据,但失败了 这是我的节点代码:- .. var preMonths = new moment().subtract(4, 'months').date(1).toDate(); //4:for 5 month var match = { $and: [] }; match.$and.push({ companyId: new ObjectID(req.user.companyId._id) });

我正在使用Mongoose4.5.0并尝试使用聚合获取数据,但失败了

这是我的节点代码:-

    ..
    var preMonths = new moment().subtract(4, 'months').date(1).toDate();     //4:for 5 month
    var match = { $and: [] };
    match.$and.push({ companyId: new ObjectID(req.user.companyId._id) });
    match.$and.push({ status: 'CONVERTED' });


    var allUnderUsers = [];
    req.session.underUser.forEach(function(element, index) {
        allUnderUsers.push(ObjectID(element))
    });
    match.$and.push({ assignTo: { $in: allUnderUsers } });

    match.$and.push({ createdOn: { $gt: preMonths, $lt: new moment().toDate() } });
    var aggregate = [
        { $match: match }, {
            $group: {
                _id: { month: { $month: "$date" },year: { $year: "$date" } },
                total: { $sum: '$value' }
            }
        }
    ];
    console.log(JSON.stringify(aggregate))
    Lead.aggregate(aggregate)
        .exec(function(err, data) {
            if (err)
                return next(err)
            var temp = [];
            data.forEach(function(element, index) {
                temp.push([moment().month(element._id.month).format('MMM')+' '+element._id.year, element.total]);
            })
            res.status(200).json(temp)
        })
   ..
以下是控制台后的查询字符串:-

> console.logaggreate

> [{$match:{$and:[{公司ID:5875bb5ba5a2f0e52f76ec6c},{状态:已转换},{分配:{$in:[587DBF58CAB7BE105D076516587DCD3EDCA5F235F862FD,587E1002DCA535F235F862FE03587E1079AD90F640757D396A,587E1193AF725041B6A4D,587E131FA725041B6A587F1705F225ED19355881FC51165F235CFC3757CFC6803CA7D]{}}{$gt:2016-10-01T09:11:19.357Z,$lt:2017-02-01T09:11:19.358Z}}},{$group:{{$id:{$month:{$month:$date},year:{$year:$date},总计:{$sum:$value}]

现在,这里是错误:-

{MongoError:无法从缺少的BSON类型转换为日期 在Function.MongoError.create/home/node_modules/mongodb core/lib/error.js:31:11 at 插座 /home/node_modules/mongodb core/lib/connection/connection.js:306:22 在emitOne事件中。js:96:13 在Socket.emit events.js:188:7 在readableAddChunk\u stream\u readable.js:172:18 在Socket.Readable.push\u stream\u Readable.js:130:10 在TCP.onread net.js:542:20名称:“MongoError”,消息:“无法从BSON类型转换为缺少日期”,确定:0,错误消息: “无法从缺少的BSON类型转换为日期”,代码:16006, 代码名:'Location16006'}


您试图在非日期字段上使用Mongo日期操作,例如$year、$month、$day

问题在于查询的这一部分:

_id: {
  month: { $month: "$date" },
  year: { $year: "$date" }
},
可能部分或所有文档在日期字段中没有值

正如你所说,这是一个打字错误,你的领域有一个不同的名称


讨论了一个类似的问题,其中字段的值存在,但不是日期类型。

您试图在非日期的字段上使用Mongo日期操作,例如$year、$month、$day

问题在于查询的这一部分:

_id: {
  month: { $month: "$date" },
  year: { $year: "$date" }
},
可能部分或所有文档在日期字段中没有值

正如你所说,这是一个打字错误,你的领域有一个不同的名称

讨论了一个类似的问题,其中字段的值存在,但不是日期类型。

您正在尝试对字符串使用$month运算符

问题在于:

 month: { $month: "$date" }
您的日期字段类似于:2017-02-01T09:11:19.358Z

这是一个字符串,年份:{$year:$date}这将适用于该日期字符串。但月份不是。您必须按如下方式转换表达式:

{ $month: ISODate("2017-02-01T09:11:19.358Z") } ie 
{ $month: ISODate("$date") }
这将解决问题

查看有关月份聚合器的更多信息:

您正在尝试对字符串使用$month运算符

问题在于:

 month: { $month: "$date" }
您的日期字段类似于:2017-02-01T09:11:19.358Z

这是一个字符串,年份:{$year:$date}这将适用于该日期字符串。但月份不是。您必须按如下方式转换表达式:

{ $month: ISODate("2017-02-01T09:11:19.358Z") } ie 
{ $month: ISODate("$date") }
这将解决问题


检查有关月份聚合器的更多信息:

从错误“无法从缺少的BSON类型转换为日期”,是否可以确保日期值不为null是的,日期值不为null此处是日期查询日志createdOn:{$gt:2016-10-01T09:11:19.357Z,$lt:2017-02-01T09:11:19.358Z}添加另一个匹配条件的可能重复项,以确保您希望属于日期类的所有字段实际上都是日期。从错误“无法从BSON类型转换为缺少日期”中,您能否确保日期值不为null是的,日期值不为null此处是日期查询日志createdOn:{$gt:2016-10-01T09:11:19.357Z,$lt:2017-02-01T09:11:19.358Z}添加另一个匹配条件的可能重复项,以确保您希望属于日期类的所有字段实际上都是日期。