Мангуст применяет методы получения перед поиском

#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? ) не могли бы вы подробнее объяснить, что вам нужно, пожалуйста…