У меня возникают проблемы с агрегацией 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
Спасибо.
Один из способов это может произойти, если у вас есть документ, где либо '' insertedOn' или endedOn 'содержит _array_, который содержит' Date'. Кроме того, 'null' является отдельным типом, поэтому вам не нужны части' $ ne: null' в объекте '$ match'. – JohnnyHK
Вы правы, '$ ne: null' часть' $ match' бесполезна. Ни один из моих документов не содержит массивы даты, хотя на самом деле я также пытался использовать один документ с полями «insertOn» и «endOn», заполненными датой, и я получаю точно такую же ошибку. – geezmo
ОК, я думаю, что вижу проблему сейчас. Вам нужно включить поля 'insertOn' и' EndOn' в ваш '$ project'. Как и сейчас, это просто одно поле «длительность». – JohnnyHK