Как использовать $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")
    } 
  } 
}
Другие вопросы по тегам