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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM