Как выполнить запрос по возрасту в Mongodb?

#date #mongodb #field

#Дата #mongodb #поле

Вопрос:

Если у меня есть поле dob (дата рождения) в MongoDB, как я могу запросить все записи, где дата рождения меньше 1/1/1990 (это строка) или меньше определенного возраста?

Ответ №1:

Вы можете сохранить свои даты DOB в формате ISO — ггггмдд — в виде простого числа, т.Е.

 db.col.insert( { dob: 19910412 } )
db.col.insert( { dob: 19900708 } )
db.col.insert( { dob: 19880511 } )
db.col.insert( { dob: 19870225 } )
  

Затем, чтобы найти все даты до определенной даты, сделайте это:

 db.col.find( { dob: { $lt: 19900101 } } )
  

Добавление индекса к этому полю ускорит выполнение этих запросов:

 db.col.ensureIndex( { dob: 1 } )
  

Ответ №2:

Либо сохраните данные как объект Date (), либо как строку в формате ISO. В обоих случаях вы можете использовать стандартные операторы $gt или $lt.

Ответ №3:

Я предлагаю сохранить «реальный» объект date, а не строку. Затем вы можете использовать обычные операторы сравнения. Если вы не можете этого сделать, альтернативой может быть сохранение целого числа по возрасту. Последний вариант менее полезен, поскольку его необходимо обновлять каждый год, но его стоит рассмотреть.

РЕДАКТИРОВАТЬ: Альтернативой, которая позволит вам работать с вашими существующими данными, было бы передать функцию сопоставления в collection.find(). Очевидно, что это влияет на производительность, поскольку функция должна оцениваться для каждого объекта в коллекции. Смотрите документы $where. Например…

 var date =  function() {
    return new Date(this.dob) < new Date('1/1/1990');
}

db.mycollection.find(date);
  

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

1. Вы также можете хранить даты в виде строки, используя формат ISO. Сравнение с датами ISO будет работать идеально, поскольку сравнение следует лексикографическому порядку..

2. @Sentinel Полезно знать. Однако операционная система не хранит даты таким образом.