mongodb find sort limit batchsize操作

find()后sort排序报错:

在使用node.js+mongodb开发的后端项目,在查询时,使用了排序,出现如下报错

Mongodb: Sort operation used more than the maximum 33554432 bytes of RAM
1
Mongodb的sort操作是把数据拿到内存中再进行排序的,默认给sort操作分配的内存为32MB,当查询数据量比较大时,超过32MB,则报错

解决方案有个思路
1、分配多点排序内存(增加10倍)

db.adminCommand({setParameter:1, internalQueryExecMaxBlockingSortBytes:335544320})
// 若内存足够,可以考虑,但是,这将比较消耗资源
1
2
2、按错误提示,创建索引

db.myCollection.createIndex({fieldName: 1}) // 1为升序,-1为降序
db.myCollection.getIndexes() //查看当前collection的索引
// 创建索引将导致以下两点问题
// 1. 写数据变慢
// 2. 索引本身站用存储
————————————————

mongodb利用foreach查询和游标遍历(mongodb 遍历对象)

 

https://docs.mongodb.com/manual/reference/method/cursor.forEach/

 

. 游标
db.collection.find()方法返回一个游标,它是数据在遍历过程中的内部指针,

是数据读取的接口,默认自动迭代20次。

方法名

作用

limit(n)

限制查询结果返回数量n

skip(n)

跳过指定数目的文档

sort({key:1 or -1})

对查询结果进行排序

explain()

用于获取查询执行过程报告

snapshot()

对查询结果使用快照

count( )

查询文档的总数量

3.1 游标使用过程:

(1)声明游标:varcursor=db.collectioName.find({query},{projection})

(2)打开游标:cursor.hasNext()判断游标是否已经取到尽头

(3)读取数据:cursor.Next()取出游标的下一个文档

(4)关闭游标:cursor.close()此步骤可省略,通常为自动关闭,也可以显示关闭

输出结果集:

(1)使用print输出游标结果集:

var cursor = db.shuju.find()

while (cursor.hasNext()) { print(tojson(cursor.next())) }

(2)使用printjson输出游标结果集:

var cursor = db.shuju.find()

while (cursor.hasNext()) { printjson(cursor.next())) }

 3.1 游标——迭代
先定义一个函数(获取文档fruit数组)var getFruit=function(obj){print(obj.fruit)} 
打开游标:var cursor=db.food.find()
迭代: cursor.forEach(getFruit)
3.2 游标——基于数组迭代
var curarray=db.shuju.find()
> var array=curarray.toArray()
> printjson(array)

注意:toArray方法将所有由游标返回的文档装载进内存,不要随意使用。

我之前就是用了toArray函数导致内存占用过大nodejs奔溃
————————————————
 http://www.ryxxff.com/57213.html

 

curor还有个foreach方法

collection.find(query).forEach(function(doc) {
  // handle
}, function(err) {
  // done or error
});

mongodb find sort limit batchsize操作

上一篇:MySQL数据库表分区-子分区


下一篇:数据库的操作(增删改查)