Дата агрегированного конвейера Мангуста больше, чем запрос с переменной bson

#node.js #mongodb #mongoose #mongodb-query

#node.js #mongodb #mongoose #mongodb-запрос

Вопрос:

На самом деле, я поднимаю этот вопрос после того, как попробовал ответы на предыдущие вопросы. но я не нахожу никакой подсказки, поэтому я спрашиваю

Пытаюсь добиться:

В агрегации mongoose я использую агрегацию конвейеров для получения документов из коллекции с помощью следующего запроса

 $match: {
  $and: [
    {
      $expr: {
        $eq: ["$device_id", "$device_id"]
      }
    },
    {
      date: {
        "$gte": "$billing_cycle_startdate",
        "$lte": endOfDay
      }
    }
  ]
}
 

дата выставления счета будет: 2020-12-31T00:00:00.000Z по следующему запросу

 {
  $addFields: {
    billing_cycle_startdate: {
      $concat: [
        year, "-", month, "-", "$device_details.billing_cycle"
      ]
    },
  }
},
{ $set: { billing_cycle_startdate: {  $toDate: "$billing_cycle_startdate" } }},
 

но этот запрос возвращает пустые результаты

если я запущу

 {
  date: {
    "$gte": new Date("2020-12-31T00:00:00.000Z"),
    "$lte": endOfDay
  }
}
 

он возвращает результаты, как и ожидалось

есть ли какой-либо другой способ преобразовать 2020-12-31T00:00:00.000Z в формат, доступный для запроса, без использования функции new Date (), а также хотите знать, в чем разница между 2020-12-31T00:00:00.000Z и новой датой («2020-12-31T00:00:00.000Z»)

Есть какой-либо другой способ выполнить этот запрос??

Заранее спасибо ..!

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

1. Если результатов вообще нет, должно быть, этап сопоставления исключает все. Можем ли мы увидеть образец документа и полный конвейер?

2. Спасибо за беспокойство, я нашел, что не так с моим запросом. это просто синтаксическая ошибка при использовании переменной @Joe

Ответ №1:

Наконец, после нескольких дней страданий я обнаружил, что не так с моим запросом

Я просто забываю использовать синтаксис let в своем конвейере, чтобы указать переменную, которая является billing_cycle_startdate, и забываю использовать ее на этапе поля конвейера

Конвейер не может напрямую обращаться к полям входного документа. Вместо этого сначала определите переменные для полей входного документа, а затем ссылайтесь на переменные на этапах конвейера.

для получения дополнительной информации: нажмите здесь

затем я изменил свой запрос следующим образом

    {
                $lookup: {
                    from: "name",
                    let: {
                        device_id: "$budget.device",
                        billing_cycle_startdate: "$billing_cycle_startdate"
                    },
                    pipeline: [
                        {
                            $match: {
                                $and: [
                                    {
                                        $expr: {
                                            $eq: ["$device_id", "$device_id"]
                                        }
                                    },
                                    {
                                        $and: [
                                            {
                                                $expr: {
                                                    $gte: ["$date", "$billing_cycle_startdate"],
                                                },
                                            },
                                            {
                                                $expr: {
                                                    $lte: ["$date", endOfDay],
                                                }
                                            }
                                        ]
                                    }
                                ]
                            }
                        }
                    ],
                    as: "dailyenergylogs"
                }
            },