I am trying to retrieve the total number of users registered each month grouping them by year and month they registered in MongoDB My user model looks like this
email: String,
gender: String,
password: {
hash: {
type: String,
// required: true
},
salt: {
type: String,
// required: true
},
reset: {
id: {
type: String,
default: "",
},
code: {
type: String,
default: "",
},
},
},
name: {
first: String,
last: String,
username: String,
},
date: {
registered: {
type: Date,
}
}
The date parameter is an ISO string
the query that I tried is this
var today = new Date();
data.newUsersEachMonth=await AccountModel.aggregate([
{ "$match": {
"date": {"date.registered": { "$lt": today.toISOString() }}
}},
{ "$group": {
"_id": {
"year": { "$year": "$date" },
"month": { "$month": "$date" },
},
"count": { "$sum": 1 }
}}
])
But it returns an empty array How can i solve this?
UPDATE
As suggested i tried these two queries
{ "$match": {
"date.registered": { "$lt": today.toISOString() }
}},
{ "$group": {
"_id": {
"year": { "$year": "$date.registered" },
"month": { "$month": "$date.registered" },
},
"count": { "$sum": 1 }
}}
])
and
data.newUsersEachMonth=await AccountModel.aggregate([
{ "$match": {
"date.registered": { "$lt": today.toISOString() }
}},
{ "$group": {
"_id": {
"year": { "$year": "$date" },
"month": { "$month": "$date" },
},
"count": { "$sum": 1 }
}}
])```
Still getting an empty array
Aggregation query should be like below,
[
{
'$match': {
'date.registered': {
'$lt': today.toISOString()
}
}
},
{
'$project': {
'month': {
'$month': '$date.registered'
},
'year': {
'$year': '$date.registered'
}
}
}, {
'$group': {
'_id': {
'month': '$month',
'year': '$year'
},
'total': {
'$sum': 1
},
'month': {
'$first': '$month'
},
'year': {
'$first': '$year'
}
}
}
]