从 mongodb 文档计算多个数组中不同值的更快方法

问题描述 投票:0回答:1

我有这种格式的 mongodb 文档:

{
    //-- type and date
    "date": "2023-11-09",
    "type": "my_type",
    "resources": "1111,5555,2222,3333,1111", 
}

我正在尝试获取特定日期的所有文档(最多 500.000 个文档)并计算资源中的不同值。 为此,这个聚合将完成这项工作:

[
  {
    $match: {
      date: "2024-01-01"
    }
  },
  {
    $project: {
      resources: "$resources"
    }
  },
  {
    $unwind: {
      path: "$resources"
    }
  },
  {
    $group: {
      _id: null,
      dv: {
        $addToSet: "$resources"
      }
    }
  },
  {
    $project: {
      total: {
        $size: "$dv"
      }
    }
  }
]

问题是这是一个非常慢的查询,需要超过15秒, 我正在寻找其他方法来及时完成工作;知道我处于反应式 Spring Boot 应用程序中。

mongodb spring-boot java-stream query-optimization spring-webflux
1个回答
0
投票

也许是这样的:

db.collection.aggregate([
{
 $match: {
  date: "2023-11-09"
  }
},
{
"$project": {
  split_field: {
    $split: [
      "$resources",
      ","
    ]
    }
  }
 },
 {
"$group": {
  _id: "",
  tot: {
    "$addToSet": "$split_field"
    }
  }
},
{
 "$project": {
  total: {
    $size: {
      "$reduce": {
        "input": "$tot",
        "initialValue": [],
        "in": {
          "$setUnion": [
            "$$this",
            "$$value"
          ]
        }
      }
    }
  }
 }
}
])

说明:

  1. $将文件与必要的日期相匹配
  2. $project 拆分 $resources 元素并转换为数组
  3. $group 拥有包含数组的单个文档(删除重复的数组)
  4. $project/$减少$setUnion的$size(以删除重复的数组元素)

游乐场

在 Playground2 示例中,$project/$group 阶段加入了 1x 阶段:

游乐场2

© www.soinside.com 2019 - 2024. All rights reserved.