【发布时间】:2015-04-16 16:32:15
【问题描述】:
为了使用 Grails (2.5.0) 和 MongoDB 插件 (3.0.2) 遍历 MongoDB (2.6.9) 集合中的所有文档,我创建了一个这样的 forEach:
class MyObjectService {
def forEach(Closure func) {
def criteria = MyObject.createCriteria()
def ids = criteria.list { projections { id() } }
ids.each { func(MyObject.get(it)) }
}
}
然后我这样做:
class AnalysisService{
def myObjectService
@Async
def analyze(){
MyObject.withStatelessSession {
myObjectService.forEach { myObject ->
doSomethingAwesome(myObject)
}
}
}
}
这很好用...直到我遇到一个很大的集合(>500K 文档),此时会抛出 CommandFailureException,因为聚合结果的大小大于 16MB。
Caused by CommandFailureException: { "serverUsed" : "foo.bar.com:27017" , "errmsg" : "exception: aggregation result exceeds maximum document size (16MB)" , "code" : 16389 , "ok" : 0.0}
在阅读此内容时,我认为处理这种情况的一种方法是在 MongoDB 端运行的聚合函数中使用选项 allowDiskUse,这样 16MB 内存限制将不适用,我可以获得更大的聚合结果。
如何将此选项传递给我的条件查询?我一直在阅读 Grails MongoDB 插件的文档和 Javadoc,但似乎找不到。是否有另一种方法来解决一般问题(迭代大量域对象的所有成员)?
【问题讨论】:
-
感谢您的清理,Beckwith 先生 :) 最后一句真的是想问“有没有更好的方法来解决一般问题?”