skip to Main Content

I have a Users table, where I store the birth date of the user as a Date field. I want to create a query to find which users have bithdays today.

How can I accomplish that with find() function from Mongoose v5?

const userSchema = new mongoose.Schema({
name: {
    type: String,
    required: [true, 'Please tell us your name!'],
},
email: {
    type: String,
    required: [true, 'Please provide your email'],
    //unique: true,
    lowercase: true,
    validate: [validator.isEmail, 'Please provide a valid email'],
},
birthdate: Date,
...
}

2

Answers


  1. Chosen as BEST ANSWER

    In the end I follow the instructions from this article https://medium.com/@luansantos_4481/how-to-return-birthdays-of-the-current-day-week-and-month-with-mongodb-aggregation-f4104fe82e3c

    basically is to use the aggregations pipeline on Mongoose.

    User.aggregate([
                            {
                                $match: {
                                    $expr: {
                                        $and: [
                                            {
                                                $eq: [
                                                    { $dayOfMonth: `$${field}` },
                                                    {
                                                        $dayOfMonth: new Date(
                                                            moment().tz(
                                                                tenant.config
                                                                    .timezone
                                                            )
                                                        ),
                                                    },
                                                ],
                                            },
                                            {
                                                $eq: [
                                                    { $month: `$${field}` },
                                                    {
                                                        $month: new Date(
                                                            moment().tz(
                                                                tenant.config
                                                                    .timezone
                                                            )
                                                        ),
                                                    },
                                                ],
                                            },
                                            {
                                                tenantId: `User-${tenant._id.toString()}`,
                                            },
                                        ],
                                    },
                                },
                            },
                        ])
                        .then((result) =>
                            result.map((r) => {
                                users.push({ tenant, user: r })
                                console.log(
                                    'tenant: ' + tenant._id + ', user: ' + r?.name
                                )
                            })
                        )
    

  2. You can use the date of the day as a query filter to match which users have birthdays today, for example, as follows.

    const UserModel = mongoose.model('User', userSchema);
    UserModel({ birthdate: 'today's date' }, function (err, result) {});
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search