#javascript #node.js #mongodb #mongoose
#javascript #node.js #mongodb #мангуст
Вопрос:
Я унаследовал коллекцию Mongo, в которой даты хранятся в виде строк, например, «2020-11-18», а не в виде дат BSON. У меня есть средство получения, которое преобразует эту строку в дату js, но я хотел бы запросить коллекцию по диапазону дат следующим образом:
const Things = mongoose.Model('Thing',
{
date: { type: String, get v => new Date(v) }
},
{
toJSON: { getters: true },
toObject: { getters: true },
}
)
Things.find({ date: { $gt: new Date("2020-11-17"), $lt: new Date("2020-11-19") } })
Похоже, что геттер не применяется к документам до выполнения запроса find. Есть ли какой-нибудь способ сделать это?
Ответ №1:
Даты в этом формате обладают тем удачным свойством, что их лексикографический порядок сортировки совпадает с их хронологическим порядком.
Это означает, что вы можете запрашивать их как строки и сопоставлять документы, которые вы ожидаете.
Например, в коллекции, содержащей
[
{"date": "2020-11-16"},
{"date": "2020-11-17"},
{"date": "2020-11-18"},
{"date": "2020-11-19"}
]
Запрос
db.Things.find({"date": {$gte: "2020-11-17", $lt: "2020-11-19"}})
Возвращает {"date": "2020-11-17"}
и {"date": "2020-11-18"}
, как и ожидалось.
Ответ №2:
Как упоминалось в этом документе:
Методы получения позволяют преобразовывать представление данных по мере их перемещения из необработанного документа mongodb в значение, которое вы видите.
Таким образом, ваш date
геттер будет запущен сразу после выполнения метода find() . В противном случае, как представление даты будет изменено до нахождения самой даты!
Другими словами:
Things.find({ date: { $gt: new Date("2020-11-17"), $lt: new Date("2020-11-19") } })
// getter will run here
.then((queryResults) =>{
})
Комментарии:
1. Спасибо, что прояснили это. Есть ли способ преобразовать данные до выдачи find?
2. Добро пожаловать. (Есть ли способ преобразовать данные до выдачи find? ) не могли бы вы подробнее объяснить, что вам нужно, пожалуйста…