• 微信公众号:美女很有趣。 工作之余,放松一下,关注即送10G+美女照片!

mongodb find sort limit batchsize操作

开发技术 开发技术 3小时前 2次浏览

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 遍历对象)

 

 

游标

  find方法使用游标返回查询结果,游标的客户端实现使你可以对最终结果做很多的控制。在shell里创建一个游标很简单,往collection里放些document,

  执行查询,将返回结果指派给一个本地变量即可。

> var cursor = db.collection.find();

> while (cursor.hasNext()) {
   obj = cursor.next();
   }

  cursor类同样实现了iterator接口,所以你可以使用forEach循环

> var cursor = db.people.find();
> cursor.forEach( function (x) {
… print(x.name);
… });

db.Goods.find().forEach(
function(item){
if(!item.goodsCode.indexOf(“ABCD”)){
var tempGoodId=item._id;
var tempGoodCode=item.goodsCode;
var temp=db.Goods.findOne({“goodsCode”:{“$regex”:”^”+tempGoodCode+”.+”}});
if(temp){
// print(tempGoodCode+”=”+item._id);
var cursor=db.GoodAttr.find({“goodsId”:tempGoodId});
cursor.forEach(function(a){
print(a);
})
}
}
}
)

————————————————

 

原文链接:https://blog.csdn.net/xiaojiahao_kevin/article/details/51565245

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操作
喜欢 (0)