#mongodb
#mongodb
Вопрос:
Структура документа в MongoDB выглядит следующим образом. Временная метка хранится в виде строки в mongo, поэтому ISODate не работает. Как я могу выбрать данные между двумя временными метками в этом случае.
{
"_id" : NumberLong(5702509046),
"totalProduct" : "0.00",
"status" : "COMPLETED",
"dateCreated" : "10/02/2020 11:31:48",
"lastUpdated" : "10/13/2020 15:39:18"
}
Среди нескольких других вещей, я попробовал что-то вроде этого, чтобы преобразовать строку date в объект date, а затем выполнить сравнение, но при этом не учитывается конечная временная метка. Он возвращает все документы, превышающие дату ввода, но не останавливается на конечной дате. Нужна помощь в исправлении этого запроса
db.getCollection("MyCollection").find({"$expr": {"$gte": [{ "$dateFromString": { "dateString": "$lastUpdated" ,timezone:"America/New_York"}}, new Date("10/09/2020 10:40:55") ]},"$expr": {"$lte": [{ "$dateFromString": { "dateString":"$lastUpdated",timezone:"America/New_York"}}, new Date("10/12/202010:14:55") ]},status:{$in:["COMPLETED"]}},{"_id":1, "lastUpdated":1}).sort({"lastUpdated":-1});
Комментарии:
1. Вы можете попробовать использовать тот
$expr
, в котором вы указываете условие (включает как больше, так и меньше).2. Похоже, что выражение может иметь только одно поле. «Ошибка запроса с кодом ошибки 15983 и сообщением об ошибке «Объект, представляющий выражение, должен иметь ровно одно поле:»
3. используйте его с
$and
оператором, что-то вроде этого:$expr: { $and: [ { $gte: [ { $toDate: "$date1" }, START_DT ] }, { $lte: [ { $toDate: "$date2" }, END_DT ] } ] }
4. Да, похоже, это сработало. Спасибо за вашу помощь @prasad_