zoukankan      html  css  js  c++  java
  • 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
    });

  • 相关阅读:
    《你不知道的javascript》读书笔记2
    你不知道的console调试
    《你不知道的javascript》读书笔记1
    使用js做LeetCode
    用装饰器来进行登录验证
    python 解压序列
    pycharm 的live_template的使用
    faker 库的使用
    Python常用内置类和常用内置函数汇总
    迭代器 ,生成器(生成器函数/生成器表达式)
  • 原文地址:https://www.cnblogs.com/youxin/p/14864187.html
Copyright © 2011-2022 走看看