Сообщество MongoDB Compass 1.16.3 $ проблема с совпадением с ObjectId ISODate

#mongodb #aggregation-framework #aggregation #mongodb-compass

#mongodb #платформа агрегации #агрегация #mongodb-compass

Вопрос:

Я пытаюсь создать aggregation сообщество MongoDB Compass 1.16.3, и у меня возникла странная проблема на $match этапе запроса ObjectId и ISODate в то же время.

Нерабочий этап сопоставления $

 {
  user_id: ObjectId("5c9168ec5530c90d0c5cd98a"),
  value: {$gte: 600},
  datetime: { $gte: ISODate("2019-02-01T00:00:00Z"), $lt: ISODate("2019-04-10T23:59:59Z") }
}
 

Этот запрос вообще не работает, и Compass возвращает Expected end of input but "}" found.

введите описание изображения здесь

Но эти этапы сопоставления работают

 {
  user_id: ObjectId("5c9168ec5530c90d0c5cd98a"),
  value: {$gte: 600}
}
 

Отличный результат!

 {
  value: {$gte: 600},
  datetime: { $gte: ISODate("2019-02-01T00:00:00Z"), $lt: ISODate("2019-04-10T23:59:59Z") }
}
 

Отличный результат!

Кажется, что запрос не работает, если я использую ObjectId и ISODate одновременно. Итак, я где-то допустил ошибку? Или мне нужно разделить его на 2 $match этапа? Есть мысли?

Отредактировано

Если я разделю конвейер на 2 $match этапа (я удалил value в этом примере), он работает хорошо, но я не знаю, является ли это хорошей практикой и эффективна ли она!

 [{
    $match: {
        user_id: ObjectId("5c9168ec5530c90d0c5cd98a")
    }
}, {
    $match: {
        datetime: {
            $gte: ISODate("2019-02-01T00:00:00Z"),
            $lt: ISODate("2019-04-01T00:00:00Z")
        }
    }
}]
 

Комментарии:

1. В условии соответствия { значение: {$gte: 600}, дата-время: { $gte: ISODate(«2019-02-01T00:00:00Z»), $ lt: ISODate(«2019-04-10T23:59:59Z») } } получаете ли вы документ с идентификатором пользователя: ObjectId («5c9168ec5530c90d0c5cd98a»)?

2. Да, для этого запроса я получаю все документы между датами, включая те, которые относятся к user_id: ObjectId («5c9168ec5530c90d0c5cd98a»)

3. Какую версию compass вы используете?

4. Это версия 1.16.3 — я должен попытаться установить последнюю версию (1.17.x), чтобы увидеть, есть ли разница.

Ответ №1:

Проблема связана с версией сообщества MongoDB Compass, которую я использовал (1.16.3).

Чтобы решить ее, обновите до последней версии или выше: 1.17.0

Теперь следующее работает отлично!

 {
  user_id: ObjectId("5c9168ec5530c90d0c5cd98a"),
  value: {$gte: 600},
  datetime: { $gte: ISODate("2019-02-01T00:00:00Z"), $lt: ISODate("2019-04-10T23:59:59Z") }
}