first, i should say that im new to mongoDB
and mongoose ODM
. my question: each document of my documents is something like this:
{
"_id": {
"$oid": "6353f73c97588e3864eaa635"
},
"text": "test!",
"date": "10/22/2022, 2:52:52 PM",
"isCompleted": false
}
they have isComplete
property that can be true
or false
.
now i want to count documents with isComplete: true
or isComplete: false
in just one query. and i want something like this result:
{completed: 4, notCompleted: 6}
i found that mongoose
has a method called count
and countDocuments
. but with these methodes, i can do what i want in 2 queries. like this:
//body of an async function
const completed = await mongoose.count({ isCompleted: true });
const notCompleted = await mongoose.count({ isCompleted: false });
i can not do something like this:
//body of an async function
const counts = await mongoose.count({ isCompleted: true, isCompleted: false });
i searched a lot about this, but i couldnt find any solution. so whats your solution? do you have any suggestion? thanks for helping.
You can use aggregate with conditional grouping, but I'm not sure whether that will be faster than 2 separated count queries in a collection with big record set since you will essentially be loading ALL your records in the pipeline.
db.collection.aggregate([
{
"$group": {
"_id": null,
"completed": {
"$sum": {
"$cond": [
{
"$eq": [
"$completed",
true
]
},
1,
0
]
}
},
"incomplete": {
"$sum": {
"$cond": [
{
"$eq": [
"$completed",
false
]
},
1,
0
]
}
},
"totalCount": {
"$sum": 1
}
},
}
])
https://mongoplayground.net/p/RynsVsi9BEJ
PS: aggregation always return an array, so you can use e.g. results[0].completed
to get number of completed records.