使用$ group管道进行条件聚合

时间:2020-04-19 19:51:52

标签: mongodb aggregation-framework

这是我的6条记录的数据...

      {
        _id: 1,
        entityProfiles:['company', 'provider']
      },
      {
        _id: 2,
        entityProfiles:['company']
      },
      {
        _id: 3,
        entityProfiles:['provider']
      },
      {
        _id: 4,
        entityProfiles:[]
      },
      {
        _id: 5,
        entityProfiles:null
      },
      {
        _id: 6,
      },

我需要知道总数,多少个EntityProfiles具有“提供者”,以及多少个没有使用$ group和/或$ project管道。 我期望如此...

  {
    _id: 'all',
    count: 6
  },
  {
    _id: 'providers',
    count: 2
  },
  {
    _id: 'nonProviders',
    count: 4
  },

...或者这个...

  {
    _id: null,
    all: 6,
    providers: 2,
    nonProviders: 4
  },

2 个答案:

答案 0 :(得分:2)

尝试这个:

db.collection.aggregate([
  {
    $group: {
      _id: null,
      all: {
        $sum: 1
      },
      providers: {
        $sum: {
          $cond: [
            {
              $in: [
                "provider",
                {
                  $ifNull: [ "$entityProfiles", [] ]
                }
              ]
            },
            1,
            0
          ]
        }
      },
      nonProviders: {
        $sum: {
          $cond: [
            {
              $in: [
                "provider",
                {
                  $ifNull: [ "$entityProfiles", [] ]
                }
              ]
            },
            0,
            1
          ]
        }
      }
    }
  }
])

MongoPlayground | 3 documents _id:count pair

答案 1 :(得分:0)

请修复$addFields聚合

db.collection.aggregate([
  {
    $facet: {
      entityProfiles: [
        {
          $unwind: {
            path: "$entityProfiles"
          }
        },
        {
          $group: {
            _id: "$entityProfiles",
            count: {
              $sum: 1
            }
          }
        }
      ],
      all: [
        {
          $group: {
            _id: null,
            count: {
              $sum: 1
            }
          }
        }
      ]
    }
  },
  {
    $addFields: {
      all: {
        $arrayElemAt: [
          "$all",
          0
        ]
      }
    }
  },
  {
    $addFields: {
      all: {
        _id: "all",
        count: "$all.count",

      }
    }
  }
])