2015-04-21 2 views
3

У меня возникают проблемы с агрегацией Mongoose при попытке вычесть две даты, чтобы получить миллисекунды разницы.

Вот структура документа:

DeliverySchema = new mongoose.Schema({ 
    hash: String, 
    status: Number, 
    insertedOn: { 
    type: Date, 
    default: Date.now 
    }, 
    endedOn: { 
    type: Date 
    } 
}, { 
    collection: 'Deliveries' 
}); 

Это запрос:

var Delivery = mongoose.model('Delivery'); 

return Delivery.aggregate([ 
    { 
     $match: { 
     'insertedOn': {$ne: null, $type: 9}, 
     'endedOn': {$ne: null, $type: 9} 
     } 
    }, 
    {$project: {duration: {$subtract: ["$endedOn", "$insertedOn"]}}}, 
    { 
     $group: { 
     _id: { 
      day: {$dayOfMonth: "$insertedOn"}, 
      month: {$month: "$insertedOn"}, 
      year: {$year: "$insertedOn"} 
     }, 
     count: {$sum: 1}, 
     durationAvg: {$avg: "$duration"} 
     } 
    }, 
    {$sort: {"_id.year": 1, "_id.month": 1, "_id.day": 1}} 
    ]) 

Это ошибка я получаю: фаза матча

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

в $ следует фильтровать все документы с полями insertOn/finishedOn null или non-Date, но это кажется бесполезным. Я застрял, у кого-нибудь есть какие-то подсказки? Я использую Mongoose 4.0.1 (mongod 2.6.9 на Mongolab) с узлом 0.10.33. Thanks

Спасибо.

+1

Один из способов это может произойти, если у вас есть документ, где либо '' insertedOn' или endedOn 'содержит _array_, который содержит' Date'. Кроме того, 'null' является отдельным типом, поэтому вам не нужны части' $ ne: null' в объекте '$ match'. – JohnnyHK

+0

Вы правы, '$ ne: null' часть' $ match' бесполезна. Ни один из моих документов не содержит массивы даты, хотя на самом деле я также пытался использовать один документ с полями «insertOn» и «endOn», заполненными датой, и я получаю точно такую ​​же ошибку. – geezmo

+0

ОК, я думаю, что вижу проблему сейчас. Вам нужно включить поля 'insertOn' и' EndOn' в ваш '$ project'. Как и сейчас, это просто одно поле «длительность». – JohnnyHK

ответ

2

Вывод этапа $project - это документы, которые содержат только вычисленное поле duration. Вы должны также включать insertedOn и endedOn поля так, чтобы они были доступны для использования в $group стадии, следующей:

{$project: { 
    duration: {$subtract: ["$endedOn", "$insertedOn"]}, 
    endedOn: 1, 
    insertedOn: 1 
}} 
+0

Да. Это решение. Спасибо @JohnnyHK, ты спас свой день :-) – geezmo

Смежные вопросы