В Meteor JS Я хочу найти пользователей, чей день рождения сегодня. У меня есть этот фрагмент кода, который отлично работает на моем компьютере (локально), но не работает на производстве:
let today = new Date()
let users = Meteor.users.find({
"status.lastLogin": { $not: { $eq: null } },
$expr: {
$and: [
{
$eq: [
{
$dayOfMonth: {
date: "$profile.birthdate",
timezone: "Europe/Paris",
},
},
today.getDate(),
],
},
{
$eq: [
{
$month: {
date: "$profile.birthdate",
timezone: "Europe/Paris",
},
},
today.getMonth() + 1,
],
},
],
},
})
Мой сервер размещен на Galaxy, а БД на mongodb.com Я проверил тип profile.birthdate, и это Date на mongodb.com Ошибка:
MongoError: невозможно преобразовать из строки типа BSON в Date \ n при подключении. (/app/bundle/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb/lib/core/connection/pool.js:450:61)\n в Connection.emit (events . js: 311: 20) \ n в Connection.EventEmitter.emit (domain. js: 482: 12) \ n в processMessage (/ app / bundle / programs / server / npm / node_modules / meteor / npm -mongo / node_modules / mongodb / lib / core / connection / connection. js: 384: 10) \ n в TLSSocket.
Кто-нибудь знает, почему это происходит и как я могу исправить это?
Изменить : Следуя совету @Jankapunkt по использованию агрегата и прочитав этот пост , я смог написать лучше (я думаю ...) запрос, и теперь он работает. Это новый код:
const today = new Date()
let users = Meteor.users.aggregate(
{
$project: {
status: "$status",
roles: "$roles",
month: {
$month: {
date: "$profile.birthdate",
timezone: "Europe/Paris",
},
},
day: {
$dayOfMonth: {
date: "$profile.birthdate",
timezone: "Europe/Paris",
},
},
},
},
{
$match: {
"status.lastLogin": { $ne: null },
roles: "candidate",
month: today.getMonth() + 1,
day: today.getDate(),
},
}
)