mongodb 合并的多个组的pymongo计数

jobtbby3  于 2023-03-17  发布在  Go
关注(0)|答案(1)|浏览(129)

我希望为一个耗时的查询创建一个按需物化视图,因为表可能一直包含2- 4 M个条目。
我目前掌握的情况是:

events.history.aggregate([
  {"$match":{"sevr":{"$ne":"NO_ALARM"}}},
  {"$group": {"_id": ["$name", "$sevr"], "count": {"$sum": 1}}},
  {"$sort": SON([("count", -1), ("_id", -1)])},
])

它给出了以下输出格式:

[
  {'_id': ["name_1", "SEVR_1"], 'count': <count>},
  {'_id': ["name_1", "SEVR_2"], 'count': <count>},
  {'_id': ["name_2", "SEVR_1"], 'count': <count>},
  {'_id': ["name_2", "SEVR_2"], 'count': <count>},
  ...
]

但是如果我试图将其合并到一个物化视图中,显然会失败,因为_id是一个列表。

[
  {'_id': "name_1", 'count': {"SEVR_1":<count>, "SEVR_2":<count>}},
  {'_id': "name_2", 'count': {"SEVR_1":<count>, "SEVR_2":<count>}},
  ...
]

目前,我所能想到的就是运行查询,修改结果以适应所需的输出,然后手动更新物化视图,这与目的不符。
我只是有查询错误,可以让它在一个很好的在线工作?
除非有一种使用vanilla mongodb/pymongo的方法可以自动检测更改(无需副本)

z9smfwbn

z9smfwbn1#

使用任何数据作为字段名都会带来额外的复杂性,但并非无法克服。
如果我没理解错的话,你可以这么做。

events.history.aggregate([
  {
    "$match": {
      "sevr": {"$ne": "NO_ALARM"}
    }
  },
  {
    "$group": {
      "_id": {
        "name": "$name",
        "sevr": "$sevr"
      },
      "count": {"$sum": 1}
    }
  },
  {"$sort": SON([("count", -1), ("_id", -1)])},
  {
    "$group": {
      "_id": "$_id.name",
      "count": {
        "$mergeObjects": {
          "$arrayToObject": [
            [{"k": "$_id.sevr", "v": "$count"}]
          ]
        }
      }
    }
  }
])

mongoplayground.net上试试。

相关问题