Поскольку 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
поле. Запрос становится намного проще и лучше.
Я предполагаю, что вы делаете это в оболочке mongo или используете javascript –