【发布时间】:2014-10-01 08:40:13
【问题描述】:
我有一个正在运行聚合管道的大型集合。我有 MongoDB 2.4。我遇到了 16 MB 的限制。我知道我可以通过升级到 2.6 来解决这个问题,但这不是我的选择。
我可以低于 16 MB 限制的另一种方法是将聚合分解为几部分,然后将部分结果合并到我的应用程序代码中。我需要拆分的字段是 ObjectId。本质上,我想要的是让我的 $match 阶段使用类似的东西:
my_objid_field: {$mod: [10, n]}
我将针对不同的 n 值运行 10 次查询。但是,我不知道该怎么表达。
典型的文档如下所示:
{
"_id" : ObjectId("514cf080358a7c3fd4113f84"),
"a" : 1,
"c" : "US",
"d" : ISODate("2013-03-23T00:00:00Z"),
"st" : ObjectId("4fcfa494c212e76b890004a2"),
"si" : 0,
"so" : ObjectId("4e9e58e62b28686b47e71cdf"),
"t" : ISODate("2013-03-23T00:00:00.779Z"),
"u" : ObjectId("4fe9845a8596aa3d990014cf"),
"se" : "dYJgW8w/kcCIJK08"
}
来自 db.currentOp() 的管道是:
"pipeline" : [
{
"$match" : {
"$or" : [
{
"du" : {
"$gt" : 25
}
},
{
"du" : {
"$exists" : false
}
}
],
"bu" : {
"$exists" : false
},
"t" : {
"$gte" : ISODate("2013-03-23T00:00:00Z"),
"$lt" : ISODate("2013-03-24T00:00:00Z")
}
}
},
{
"$group" : {
"c" : {
"$sum" : 1
},
"_id" : {
"t" : "$st",
"o" : "$so"
}
}
}
]
该查询匹配大约 2000 万个文档,并产生大约 200000 个文档。查询运行了几分钟,然后失败并显示“聚合结果超出最大文档大小 (16MB)”。
【问题讨论】:
-
你在哪里突破限制?在管道中还是在结果中?您可以通过在问题中包含聚合操作来更好地表达您的问题,然后清楚要分解什么。
标签: mongodb mongodb-query aggregation-framework