2014-11-20 3 views
1

MongoDB образец документа приведен ниже:запрос по Отметка в MongoDB

{ 
    "_id" : ObjectId("5f2df113bdde22f1043g45gg"), 
    "cd" : 1395376406, 
    "dob" : 552026006, 
    "e" : "[email protected]", 
    "g" : "M" 
} 

мне нужно запросить, чтобы получить список рождения на сегодняшний день с помощью DOB (дата рождения) поля (метки времени).

Заранее благодарен!

ответ

1

Я не уверен, как шикарно мое решение, но оно должно работать

var start = new Date(); 
start.setHours(0,0,0,0); 

var end = new Date(); 
end.setHours(23,59,59,999); 

db.collection.find({dob:{$gt:start.getTime(), $lt:end.getTime()}}) 
+0

Я предполагаю, что вы делаете это в оболочке mongo или используете javascript –

1

Поскольку MongoDb не имеет встроенные функции/операции для поддержки разбора сырой timestamps и извлечения информации из них, вам нужно выполните операцию, передав на сервер пользовательскую функцию java-скрипта и выполните ее там. Однако эта функция будет выполнена для каждой записи.

db.collection.find({$where:function(){ 
     var recDate = new Date(this.dob); 
     var recDay = recDate.getDate(); 
     var recMonth = recDate.getMonth(); 

     var today = new Date(); 
     var todayDate = today.getDate(); 
     var todayMonth = today.getMonth(); 

    return (recDay == todayDate && recMonth == todayMonth); 
}}); 

Функция просто проверяет, соответствуют ли день и месяц дня и дня месяца. Хотя это работает для временных меток, вы должны использовать тип данных MongoDB ISODate всякий раз, когда вы храните информацию о дате. Это позволяет использовать в этих полях различные операторы и функции. Более того, они будут быстрее. Если документ был ниже структуру:

{ 
    "_id" : "1", 
    "cd" : 1395376406, 
    "dob" : ISODate("2014-11-19T08:00:00Z"), 
    "e" : "[email protected]", 
    "g" : "M" 
} 

Где, поле д.р. имеет ISODate типа. Вы можете легко выполнить операцию aggregate для получения результатов.

var todayDate = ISODate().getDate(); 
var todayMonth = ISODate().getMonth(); 

db.collection.aggregate([ 
{$project:{"day":{$dayOfMonth:"$dob"}, 
      "month":{$month:"$dob"}, 
      "_id":1,"cd":1,"dob":1,"e":1,"g":1}}, 
{$match:{"day":todayDate,"month":todayMonth}}, 
{$project:{"cd":1,"dob":1,"e":1,"g":1,"_id":1}} 
]) 

Вышеописанная операция использует функции и операции, которые разрешены на ISODate поле. Запрос становится намного проще и лучше.

Смежные вопросы