gpt4 book ai didi

mongodb - 为什么我的聚合超过最大文档大小?

转载 作者:行者123 更新时间:2023-12-02 00:53:28 26 4
gpt4 key购买 nike

我有一个名为 roles 的集合和另一个名为 subjects 的集合。每个主题都有一个名为 role_id 的字段,其中包含该主题角色的 ID。我正在尝试使用此查询计算每个角色的主题数量:

db.roles.aggregate([
{"$lookup" : {
"from": "subjects",
"localField": "_id",
"foreignField": "role_id",
"as": "subject_matches"
} },
{"$project": { "_id": 1, "total_matches": {"$size": "$subject_matches"} } },
{"$out": "testing"}
], {allowDiskUse: true} )

当我这样做时,出现以下错误:

assert: command failed: {
"ok" : 0,
"errmsg" : "Total size of documents in subjects matching { role_id: { $eq: ObjectId('55421027b2fb3e916f0001e9') } } exceeds maximum document size",
"code" : 4568
} : aggregate failed
_getErrorWithCode@src/mongo/shell/utils.js:25:13
doassert@src/mongo/shell/assert.js:13:14
assert.commandWorked@src/mongo/shell/assert.js:267:5
DBCollection.prototype.aggregate@src/mongo/shell/collection.js:1312:5
@(shell):1:1

我不确定为什么会得到这个——根据 Mongo 文档,结果大小限制仅适用于返回的文档,并且在管道处理 (https://docs.mongodb.com/manual/core/aggregation-pipeline-limits/) 期间可以超过此大小限制。由于我返回的文档仅包含 _idtotal_matches 字段,看来我不应该收到此错误。

当我对我的集合的一小部分执行此操作时,它起作用了,结果如下所示:

`{ "_id" : ObjectId("55421026b2fb3e916f000001"), "total_matches" : 208 }
{ "_id" : ObjectId("55421026b2fb3e916f000002"), "total_matches" : 2 }
{ "_id" : ObjectId("55421026b2fb3e916f000003"), "total_matches" : 11 }
{ "_id" : ObjectId("55421026b2fb3e916f000004"), "total_matches" : 0 }
{ "_id" : ObjectId("55421026b2fb3e916f000005"), "total_matches" : 87 }`

有什么想法吗?

最佳答案

我最终解决了这个问题,首先将主题集合中的 role_id 计数放入一个新的 role_counts 集合中:

db.subjects.aggregate([
{"$group": {
"_id": "$role_id",
"count": {"$sum": 1},
}},
{"$out": "role_counts"}
])

然后进行从角色到角色计数的查找:

db.roles.aggregate([    
{"$lookup" : {
"from": "role_counts",
"localField": "_id",
"foreignField": "_id",
"as": "role_matches"
}
},
{"$unwind": {"path": "$role_matches", "preserveNullAndEmptyArrays": true}},
{"$project": {
"count": "$role_matches.count", "_id": 1
}}
])

这避免了导致文档大小限制问题的长数组。

感谢大家的帮助!

关于mongodb - 为什么我的聚合超过最大文档大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37779741/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com