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
});