在mongo聚合框架中可以使用选项{allowDiskUse:true}
。当一些繁重的操作(例如排序)无法在内存中执行时,这非常有用。
我试图对createView
(在Mongo 3.4中提供)做同样的事情,但我找不到可以引入allowDiskUse
的地方。
在正常的聚合框架中:
db.mydb.aggregate([....,{$sort:{"a":-1}}],{allowDiskUse:true})
有效,但是:
db.createView("newview","mydb",[....,{$sort:{"a":-1}}],{allowDiskUse:true})
产生错误
The field 'allowDiskUse' is not a valid collection option.
当然,我可以删除{allowDiskUse:true}
。然后创建视图,但是当我尝试时:
> db.newview.find()
Error: error: {
"ok" : 0,
"errmsg" : "Sort exceeded memory limit of 104857600 bytes, but did not opt in to external sorting. Aborting operation. Pass allowDiskUse:true to opt in.",
"code" : 16819,
"codeName" : "Location16819"
}
如何创建包含大型操作的视图?
答案 0 :(得分:1)
创建视图时无法使用allowDiskUse
,因为它不是create
选项。实际上,唯一支持的选项是collation
选项,也是版本3.4中的新选项
解决此问题的一种方法是将allowDiskUse
传递给您的聚合查询,使用$out
选项将聚合结果写入新集合,并在新创建的集合上创建视图。
但是以这种方式创建的视图没有任何价值,因为在查询视图之前,每次都需要使用$out
重新创建新集合。
另一种解决方法是对视图执行聚合,并传递closed JIRA
中提到的allowDiskUse
选项
答案 1 :(得分:1)
万一有人发现同样的问题,jira的Kyle Suarez提出了以下解决方法:
db.newview.aggregate([], { allowDiskUse: true });
也就是说,在视图上使用聚合可以解决问题。