exception: can't convert from BSON type EOO to Date

匿名 (未验证) 提交于 2019-12-03 02:56:01

问题:

I am getting an issue for running the following aggregate query:

db.snippets.aggregate([ { '$project': { month: { '$month': '$created_at' }} } ]) 

The error message for the same is:

assert: command failed: {         "errmsg" : "exception: can't convert from BSON type EOO to Date",         "code" : 16006,         "ok" : 0 } : aggregate failed 

How do i get around this issue. I found a related question

Related Stack Overflow question

But it doesnt tell how to get things done.

回答1:

You likely have one or more docs with a created_at value that's not a BSON Date and you'll need to fix that by converting those values to Date or removing them.

You can find those docs with a $not query that uses the $type operator like:

db.snippets.find({created_at: {$not: {$type: 9}}}) 

If the created_at values are date strings, you can find the docs that need updating and then update them in the shell using code like:

db.snippets.find({created_at: {$not: {$type: 9}}}).forEach(function(doc) {     // Convert created_at to a Date      doc.created_at = new Date(doc.created_at);     db.snippets.save(doc); }) 


回答2:

In some situations, some documents are supposed to have empty Date fields. In those cases, you could try this (using your example):

db.snippets.aggregate([ { '$project': { month:    { $cond: [{ $ifNull: ['$created_at', 0] }, { $month: '$created_at' }, -1] }} } ]) 

In this example, we would get -1 in the cases whenever no field '$created_at' is found. For all the other cases, we would get the Date month.



回答3:

I had a related issue, but in my case the Date fields were the members of an array, so the error was "can't convert BSON type Object to Date".

I needed to get the day of week from the dates in the possibleTripDateTimes array.

Sample document:

{ "possibleTripDateTimes" : [     {         "tripDateTime" : ISODate("2015-08-01T06:00:00.000-0700")     } ] } 

The fix was simply to use dot notation to address the array member fields.

db.trips.aggregate([   {        $project: {          departTime: {            $map: {              input: "$possibleTripDateTimes.tripDateTime",              as: "dateTime",              in: { $dayOfWeek: "$$dateTime" }            }    }   } } ] ); 

I hope this helps someone who also gets zero search results on the "BSON type Object" search



回答4:

try this one, its help for me above problem.

db.snippets.aggregate([{ '$project': {     month: { $substr: ["$created_at", 5, 2] } }  }]); 

above code get month wise

data is entered into the database in ISO format which can then be easily worked with.



回答5:

I had the same problem, I figured that the date field is missing for some of the documents causing the conversion to fail. I just added a match clause to filter these out. But ofcourse i am investigating on my app side why they are not being populated.

db.snippets.aggregate([   {     '$match': {       'created_at': {         "$exists": true       }     }   },   {     '$project': {       month: {         '$month': '$created_at'       }     }   } ]) 


回答6:

This error can also appear if you have incorrectly named your properties in your aggregation relative to what they are in your database.

For example my code was

$group: {         _id: {$week: "$projects.timeStamp"},         total: { $sum: "$projects.hours"  }     } 

But I hadn't camelcased timestamp in my database so simply modifying to projects.timestamp fixed it.



回答7:

I had a similar problem, and solved it checking if the date existed.

db.users.aggregate([ {$project:{day:  { $cond: ["$bd", { $dayOfMonth: "$bd" }, -1] },            month:  { $cond: ["$bd", { $month: "$bd" }, -1] },            year:  { $cond: ["$bd", { $year: "$bd" }, -1] }            }}, {$match:{"month":1, "day":15}} ]) 

My date field is bd and with that match I'm getting all users that have their birthday on January 15th.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!