【问题标题】:How to aggregate through nested dictionaries, sum its values, and rank them accordingly?如何通过嵌套字典进行聚合,对其值求和并相应地对它们进行排名?
【发布时间】:2021-06-23 04:57:15
【问题描述】:

我有一个 MongoDB 数据库,其中包含文档级别的单词频率,如下所示。我有大约 175k 个相同格式的文档,总计大约 2.5GB。

{
    "_id": xxx,
    "title": "zzz",
    "vectors": {
        "word1": 28,
        "word2": 22,
        "word3": 12,
        "word4": 7,
        "word5": 4
    }

现在我想遍历所有文档,计算每个单词的所有频率之和,并根据频率获得我在vectors 字段中的这些单词的总排名:

{
    "vectors": {
        "word1": 223458,
        "word2": 98562,
        "word3": 76433,
        "word4": 4570,
        "word5": 2599
    }

$unwind 似乎在这里不起作用,因为我有一个嵌套字典。我对 MongoDB 比较陌生,我找不到具体的答案。有什么想法吗?

【问题讨论】:

  • 你只有5个字或者它的动态?
  • 它是动态的,每个文档 500 到 1500 个字。
  • 如果您有至少 500 个属性,我认为在 mongodb 中没有更好的方法来执行此操作,请查看 hhharsha36 的答案,但它的速度不会很好,因为根据您的数据。
  • 确实很慢,每个查询需要 5 到 10 分钟。在找到更好的解决方案之前,我会坚持@hhharsha36 的回答。

标签: python mongodb aggregation-framework pymongo


【解决方案1】:

您必须使用$objectToArray 将子对象的键转换为值,然后使用新转换的数组$unwind$unwind 仅适用于数组字段,这就是它不适合您的原因)。

最后,按$vectors.k 分组,其中子对象键已转换为值。

db.collection.aggregate([
  {
    "$project": {
      "vectors": {
        "$objectToArray": "$vectors"
      }
    },
  },
  {
    "$unwind": "$vectors"
  },
  {
    "$group": {
      "_id": "$vectors.k",
      "count": {
        "$sum": "$vectors.v"
      },
    },
  },
])

Mongo Playground Sample Execution

【讨论】:

  • 完美答案,感谢您的帮助。 + 我加了{'$sort': {'count': -1}},从最频繁到最少,加上{allowDiskUse: true},因为数据比较大。
  • 很高兴它对您有所帮助;) 将更新答案,如果我找到更好的解决方案,请告诉您。
猜你喜欢
  • 2015-03-31
  • 1970-01-01
  • 2020-11-11
  • 1970-01-01
  • 2020-04-29
  • 2021-05-31
  • 2014-05-01
  • 2016-02-24
  • 2018-11-23
相关资源
最近更新 更多