Node.js MongoError:无法从缺少的BSON类型转换为日期
我正在使用Mongoose4.5.0并尝试使用聚合获取数据,但失败了 这是我的节点代码:-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) });
..
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}添加另一个匹配条件的可能重复项,以确保您希望属于日期类的所有字段实际上都是日期。