2013-04-24 22 views
9

Tôi cố gắng sử dụng khuôn khổ hợp (với ruby) và dự án ngày như thế này:MongoDB: không thể chuyển đổi từ loại BSON EOO to Date

db['requests'].aggregate([ 
{"$project" => { 
    _id: 0, 
    method: '$method', 
    user: '$user', 
    year: {'$year' => '$timestamp'} 
}}]) 

tài liệu là như thế này một:

{ 
_id: ObjectId("5177d7d7df26358289da7dfd"), 
timestamp: ISODate("2013-04-12T03:58:05+00:00"), 
method: "POST", 
status: "200", 
inputsize: "874", 
outputsize: "4981", 
user: "131" 
} 

nhưng tôi nhận được lỗi sau:

Mongo::OperationFailure: Database command 'aggregate' failed: (errmsg: 'exception: can't convert from BSON type EOO to Date'; code: '16006'; ok: '0.0'). 

Đây là kỳ lạ bởi vì nó hoạt động một cách chính xác nếu tôi chạy này trên db chính xác cùng mà tôi s nhập khẩu với mongorestore.

+0

Dường như thứ tự của mảng được truyền vào tổng hợp() là quan trọng. Nếu bạn có các trường bị bỏ sót, bạn sẽ muốn thêm trường đó vào $ match và có $ match là phần tử đầu tiên trong mảng. I E. > db.user_account.aggregate ([{$ match: {"uts": {$ exist: true}, "chan_key": "333261c7a72650a95c68d30cd70"}}, {$ project: {"period_month": {$ month: "$ uts "}}}, {$ nhóm: {_id: {" period_month ":" $ period_month "}," number ": {$ sum: 1}}}]) –

Trả lời

20

Vấn đề là tôi đã lưu một số tài liệu không có dấu thời gian.

+0

Yup! Tôi cũng vậy. Tôi đã tìm kiếm các tài liệu mà dấu thời gian của tôi là 'không' và chỉ có một tài liệu. Tôi đã sửa nó, và thì đấy! truy vấn hoạt động. –

+1

Bạn có thể đưa ra một ví dụ về cách bạn tìm thấy các tài liệu đó. – jsbisht

2

Nếu bạn cần phải có một số tài liệu mà không cần trường timestamp này, bạn có thể thử này (Tôi đang sử dụng Javascript/Mongoose ký hiệu):

year: { $cond: [{ $ifNull: ['$timestamp', 0] }, { $year: '$deliveryDateEnd' }, -1] } 

Trong trường hợp này, mỗi tài liệu mà không lĩnh vực timestamp sẽ trở lại -1. Tất cả các tài liệu khác sẽ trở lại năm như mong đợi.

Các vấn đề liên quan