ring
ring

Reputation: 1

Count value in every day. Help me, I'm newbie

how do i query mongodb to be so .. thank

{
    status: A
    date: 1/1
},
{
    status: A
    date: 1/1
}
{
    status: B
    date: 1/1
}
{
    status: B
    date: 2/1
}
{
    status: B
    date: 5/1
}

Result:

 {
     date: 1/1,
     statusA: 2,
     statusB: 1
 }
  {
     date: 2/1,
     statusA: 0,
     statusB: 1
 }
  {
     date: 3/1,
     statusA: 0,
     statusB: 0
 }  {
     date: 4/1,
     statusA: 0,
     statusB: 0
 } 
 {
     date: 5/1,
     statusA: 0,
     statusB: 1
 }

Upvotes: 0

Views: 45

Answers (2)

Harty911
Harty911

Reputation: 97

You can use aggregate pipline API:

  1. group element by date while counting statusA/B using $sum 1 or 0 depending on $eq conditon result
  2. Then project the result to rename _id by date (as you expected in your exemple)
db.collection.aggregate()
  .group({
      _id: "$date",
      statusA: { $sum: 
          { $cond: [{ $eq: [ "$status", "A" ]}, 1, 0 ]}
      },
      statusB: { $sum: 
          { $cond: [{ $eq: [ "$status", "B" ]}, 1, 0 ]}
      }
  })
  .project({
      date: "$_id",
      statusA: 1,
      statusB: 1,
      _id: 0
    });

Upvotes: 0

varman
varman

Reputation: 8894

You can use $group

db.collection.aggregate([
  {
    $group: {
      _id: "$date",
      statusA: {
        $sum: {
          $cond: [
            { $eq: [ "$status","A"] },
            1,
            0
          ]
        }
      },
      statusB: {
        $sum: {
          $cond: [
            { $eq: [ "$status", "B" ]},
            1,
            0
          ]
        }
      }
    }
  }
])

Working Mongo playground

Upvotes: 1

Related Questions