我有这种格式的 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 应用程序中。
也许是这样的:
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"
]
}
}
}
}
}
}
])
说明:
在 Playground2 示例中,$project/$group 阶段加入了 1x 阶段: