首页 > 解决方案 > Mongodb:是否可以在一个查询中执行此操作?

问题描述

我是 Mongodb 的新手,这是我的文档格式:

{
    "_id": {
        "$oid": "5ee023790a0e502e3a9ce9e7"
    },
    "data": {
        "Quick": [
            ["1591745491", "4", "uwp"],
            ["1591745492", "4", "uwp"],
            ["1591745516", "12", "Word"],
            ["1591747346", "8", "uwp"]
        ]
        "Key": [
            ["1591747446", "Num"]
        ]
        "Search": [
            ["1591745491", "tty"],
            ["1591745492", "erp"],
            ["1591745516", "Word"],
            ["1591747346", "uwp"]
        ]

    },
    "devicecode": "MP1G5L9EMP1G5L9E@LENOVO"
}

我想做的是:

目前我正在使用 python 程序来完成这项工作。但我相信这应该是在 Mongodb 中完成它的一种方式。

输出格式应如下所示:

devicecode: MP1G5L9EMP1G5L9E@LENOVO, Quick: 400, key: 350, Search: 660
...

标签: mongodb

解决方案


您可以使用聚合框架来计算阶段中单个数组的长度,$set然后在$group阶段分组设备中计算从前一阶段计算的数组长度值。最后,在$project舞台上映_id射到devicecode并取消选择_id

  db.getCollection("testcollection").aggregate([
  {
    $set: {
      QuickLen: {
        $size: {
          $ifNull: [
            "$data.Quick",
            []
          ]
        }
      },
      KeyLen: {
        $size: {
          $ifNull: [
            "$data.Key",
            []
          ]
        }
      },
      SearchLen: {
        $size: {
          $ifNull: [
            "$data.Search",
            []
          ]
        }
      }
    }
  },
  {
    $group: {
      _id: "$devicecode",
      Quick: {
        $sum: "$QuickLen"
      },
      key: {
        $sum: "$KeyLen"
      },
      Search: {
        $sum: "$SearchLen"
      }
    }
  },
  {
    $project: {
      devicecode: "$_id",
      Quick: 1,
      key: 1,
      Search: 1,
      _id: 0
    }
  }
])

推荐阅读