首页 > 解决方案 > 按列表中的元素和按字段计数

问题描述

我有一个如下所示的 MongoDB 集合:

{ "_id" : 1, "owner" : "Alice", airline: "RSAirlines", "content" : ["shoes", "pants", "sockets"]}
{ "_id" : 2, "owner" : "Bob", airline: "RSAirlines", "content" : ["phone", "pants"]}
{ "_id" : 3, "owner" : "Charlie", airline: "RSAirlines", "content" : ["shoes", "pants", "bag"]}
{ "_id" : 4, "owner" : "Mary" ,airline: "AirES" "content" : ["sandals", "coins", "sockets"]}
{ "_id" : 5, "owner" : "Olivia", airline: "AirES", "content" : ["gloves", "pants", "sockets"]}
{ "_id" : 6, "owner" : "Dan", airline: "AirES", "content" : ["sockets", "wallet"]}
{ "_id" : 7, "owner" : "Erin", airline: "AirES", "content" : ["pants", "sockets", "dress"]}

我希望aggregate他们得到以下结果:

{ "_id": "RSAirlines", "counts": {
    "shoes": 2,
    "pants": 3,
    "sockets": 1,
    "phone": 1,
    "bag": 1
}}
{ "_id": "AirES", "counts": {
    "sandals": 1,
    "coins": 1,
    "sockets": 4,
    "wallet": 1,
    "dress": 1,
   "pants": 2
}}

以前我看到了这个计算元素的答案,但现在我想用airline.

标签: mongodbaggregation-framework

解决方案


  • $unwind解构content数组
  • $group通过airlineandcontent得到总数
  • $group由唯一airline和构造counts数组键值格式
  • $arrayToObject将键值数组转换为对象
db.collection.aggregate([
  { $unwind: "$content" },
  {
    $group: {
      _id: {
        airline: "$airline",
        content: "$content"
      },
      count: { $sum: 1 }
    }
  },
  {
    $group: {
      _id: "$_id.airline",
      counts: {
        $push: {
          k: "$_id.content",
          v: "$count"
        }
      }
    }
  },
  { $project: { counts: { $arrayToObject: "$counts" } } }
])

操场


推荐阅读