mongodb 在MondoDB中将数组还原为对象

ftf50wuq  于 2023-03-01  发布在  Go
关注(0)|答案(1)|浏览(166)

我有一个类型为

{
  venue: 'La Rocca'
  shifts: [
    { type: 'Morning', employee: 'Jake Sullivan' },
    { type: 'Morning', employee: 'Paul Smith' },
    { type: 'Evening', employee: 'Mike Sullivan' },
    { type: 'Morning', employee: 'Mike Belloney' },
  ]
}

我想使用$reduce创建一个属性,如下所示:

{
  counts: {
    morning: 3,
    evening: 1,
  },
}

这可以通过避免$unwind$group来实现吗?如果可以,如何实现?

px9o7tmv

px9o7tmv1#

您可以使用以下选项:

db.collection.aggregate([
   {
      $set: {
         counts: {
            $reduce: {
               input: { $setUnion: "$shifts.type" },
               initialValue: [],
               in: {
                  $concatArrays: ["$$value",
                     [{
                        k: "$$this",
                        v: {
                           $size: {
                              $filter: {
                                 input: "$shifts",
                                 as: "item",
                                 cond: { $eq: ["$$item.type", "$$this"] }
                              }
                           }
                        }
                     }]
                  ]
               }
            }
         }
      }
   },
   {
      $project: {
         counts: { $arrayToObject: "$counts" }
      }
   }
])

Mongo Playground

相关问题