#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") }
}