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