将createView与allowDiskUse

时间:2016-12-14 18:26:48

标签: mongodb aggregation-framework

在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"
}

如何创建包含大型操作的视图?

2 个答案:

答案 0 :(得分:1)

创建视图时无法使用allowDiskUse,因为它不是create选项。实际上,唯一支持的选项是collation选项,也是版本3.4中的新选项

解决此问题的一种方法是将allowDiskUse传递给您的聚合查询,使用$out选项将聚合结果写入新集合,并在新创建的集合上创建视图。

但是以这种方式创建的视图没有任何价值,因为在查询视图之前,每次都需要使用$out重新创建新集合。

另一种解决方法是对视图执行聚合,并传递closed JIRA

中提到的allowDiskUse选项

答案 1 :(得分:1)

万一有人发现同样的问题,jira的Kyle Suarez提出了以下解决方法:

 db.newview.aggregate([], { allowDiskUse: true });

也就是说,在视图上使用聚合可以解决问题。