Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

how to count two same property with different values in mongoose?

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:

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

//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.

>Solution :

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.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading