Как использовать $ifNull на этапе $match в MongoDB
Я добавил условие, как показано ниже, для агрегации в mongodb.
"$match" : {
$ifNull: ["$startDate", "$createdAt"] : {"$gte": ISODate("2018-06-01 10:03:46.000Z"), "$lte": ISODate("2018-06-29 10:03:46.000Z")}
}
Когда я проверяю startDate
если он не определен или ноль, я получаю createdAt
но это показывает мне ошибку при выполнении.
Что не так в моем запросе?
0 ответов
Первая проблема с вашим запросом заключается в том, что ваш объект $ match не является допустимым объектом js. Нельзя заменить ключ объекта чем-то подобным. Кроме того, есть другие ограничения для $ match.
Как указано в документации матча mongodb
Синтаксис запроса $ match идентичен синтаксису запроса операции чтения; т.е. $ match не принимает необработанные выражения агрегирования. Чтобы включить выражение агрегирования в $ match, используйте выражение запроса $expr:
{ $match: { $expr: { <aggregation expression> } } }
$ ifNull можно использовать в $ match следующим образом;
{
$match: {
$expr: {
$gte: [
{$ifNull: ["$startDate", "$createdAt"]},
ISODate("2018-06-01 10:03:46.000Z")
]
}
}
}
Возможные варианты вашего запроса:
Использование только $match:
{
$match: {
$expr: {
$and: [
{ $gte: [
{$ifNull: ["$startDate", "$createdAt"]},
ISODate("2018-06-01 10:03:46.000Z")
]},
{ $lte: [
{$ifNull: ["$startDate", "$createdAt"]},
ISODate("2018-06-29 10:03:46.000Z")
]}
]
}
}
}
В качестве альтернативы вы можете использовать $project для вычисления значения и использования на более поздних этапах
{
$project: {
'computedStartDate' : {$ifNull: ["$startDate", "$createdAt"]}
}
},
{
$match: {
"computedStartDate":
{"$gte": ISODate("2018-06-01 10:03:46.000Z"), "$lte": ISODate("2018-06-29 10:03:46.000Z")
}
}
}