Multiple Counts with single query in mongodb

前端 未结 3 751
被撕碎了的回忆
被撕碎了的回忆 2020-11-27 07:35

I am new to Mongo Db and would appreciate some help with this query. I have been sifting through posts here for the past couple of days tearing my hair to see if I could fin

相关标签:
3条回答
  • 2020-11-27 07:48
    db.Movies.aggregate(
    
        // Pipeline
        [
            // Stage 1
            {
                $group: {
                    _id: null,
                    Total: {
                        $sum: 1
                    },
                    docs: {
                        $push: '$$ROOT'
                    }
                }
            },
    
            // Stage 2
            {
                $project: {
                    _id: 0,
                    Total: 1,
                    Released: {
                        $filter: {
                            input: "$docs",
                            as: "doc",
                            cond: {
                                $ne: ["$$doc.ReleaseDate", ""]
                            }
                        }
                    },
                    Unreleased: {
                        $filter: {
                            input: "$docs",
                            as: "doc",
                            cond: {
                                $eq: ["$$doc.ReleaseDate", ""]
                            }
                        }
                    },
                }
            },
    
            // Stage 3
            {
                $project: {
                    Total: 1,
                    Released: {
                        $size: '$Released'
                    },
                    UnReleased: {
                        $size: '$Unreleased'
                    }
                }
            },
    
        ]
    
    
    
    );
    
    0 讨论(0)
  • 2020-11-27 08:03

    You can try below $facet aggregation

    $count aggregation will always give you the counts for only single matching ($match) condition. So you need to further divide your each count into multiple section and that's what the $facet provides by processes multiple aggregation pipelines within a single stage on the same set of input documents.

    db.collection.aggregate([
      { "$facet": {
        "Total": [
          { "$match" : { "ReleaseDate": { "$exists": true }}},
          { "$count": "Total" },
        ],
        "Released": [
          { "$match" : {"ReleaseDate": { "$exists": true, "$nin": [""] }}},
          { "$count": "Released" }
        ],
        "Unreleased": [
          { "$match" : {"ReleaseDate": { "$exists": true, "$in": [""] }}},
          { "$count": "Unreleased" }
        ]
      }},
      { "$project": {
        "Total": { "$arrayElemAt": ["$Total.Total", 0] },
        "Released": { "$arrayElemAt": ["$Released.Released", 0] },
        "Unreleased": { "$arrayElemAt": ["$Unreleased.Unreleased", 0] }
      }}
    ])
    

    Output

    [{
        "Total": 3,
        "Released": 2,
        "Unreleased": 1
    }]
    
    0 讨论(0)
  • 2020-11-27 08:04

    You can use below aggregation.

    $gt > null - to check whether field exists or not in aggregation expressions.

    $cond with $sum to output 0 and 1 based on release date filter.

    $add to add both released and unreleased count to output total.

    db.Movies.aggregate([
     {"$group":{
       "_id":null,
       "Unreleased":{"$sum":{"$cond":[{"$and":[{"$gt":["$ReleaseDate",null]},{"$ne":["$ReleaseDate",""]}]},0,1]}},
       "Released":{"$sum":{"$cond":[{"$and":[{"$gt":["$ReleaseDate",null]},{"$ne":["$ReleaseDate",""]}]},1,0]}}
     }},
     {"$addFields":{"Total":{"$add":["$Unreleased","$Released"]}}}
    ])
    
    0 讨论(0)
提交回复
热议问题