Агрегация с использованием $ group pipe с условиями - PullRequest
1 голос
/ 19 апреля 2020

Это мои данные с 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 и / или $ Проектный трубопровод. Я ожидал этого ...

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

... или этого ...

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

Ответы [ 2 ]

2 голосов
/ 20 апреля 2020

Попробуйте это:

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 документа _id:count пара

0 голосов
/ 19 апреля 2020

исправьте $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",

      }
    }
  }
])
...