MongoError:无法从缺少的BSON类型转换为Date

时间:2017-02-01 09:25:48

标签: node.js mongodb mongoose

我正在使用mongoose 4.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.log(aggreate)

           

>   [{ “$匹配”:{ “$和”:[{ “companyId”: “5875bb5ba5a2f0e52f76ec6c”},{ “地位”: “翻新”},{ “assignTo”:{ “$的”: “587dbf58cab7be105d076516” “587dcd3edca5f235f862fdfd”, “587e1002dca5f235f862fe03”, “587e1079ad90f640757d396a”, “587e1193af725041b6a41a4d”, “587e131faf725041b6a41a58”, “587f1705edf2fa25f0ed1935”, “5881a1ffc51165fbc30a2c60”, “58873cb9ca352ccf80337ccd”]}},{ “createdOn”:{ “$ GT”:“2016-10 -01T09:11:19.357Z “ ”$ LT“: ”2017-02-01T09:11:19.358Z“}}]}},{ ”$组“:{ ”_ ID“:{ ”月“:{” $月 “:” $日期 “},” 年 “:{” $年 “:” $日期 “}},” 总 “:{” $总和 “:” $值“}}}]

现在,这里有错误: -

  

{MongoError:无法从BSON类型转换为Date       在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(events.js:96:13)       在Socket.emit(events.js:188:7)       在readableAddChunk(_stream_readable.js:172:18)       在Socket.Readable.push(_stream_readable.js:130:10)       在TCP.onread(net.js:542:20)名称:'MongoError',消息:'无法将BSON类型丢失转换为Date',ok:0,errmsg:   '无法将BSON类型转换为Date',代码:16006,
  codeName:'Location16006'}

2 个答案:

答案 0 :(得分:4)

您正尝试在不是日期的字段上使用Mongo日期操作(例如$year$month$day)。

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

_id: {
  month: { $month: "$date" },
  year: { $year: "$date" }
},

可能部分或全部文件在date字段中没有任何价值。

(正如你所说,这是一个错字,你的领域有一个不同的名字!)

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

答案 1 :(得分:-1)

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

问题在这里:

 month: { $month: "$date" }

您的日期字段类似于:"2017-02-01T09:11:19.358Z"

是字符串,year: { $year: "$date" }将在该日期字符串上运行。但是月份不是。您必须按以下方式转换表达式:

{ $month: ISODate("2017-02-01T09:11:19.358Z") } ie 
{ $month: ISODate("$date") }

将解决问题。

查看有关月份汇总器的更多信息:https://docs.mongodb.com/manual/reference/operator/aggregation/month/