慢的猫鼬请求

时间:2014-03-27 22:23:13

标签: node.js mongodb mongoose

我的Mongoose查询速度非常慢。我把它缩小到Mongoose创建对象的方式或db服务器请求中的实际延迟。我几乎没有数据库中的任何数据(< 4个集合中的每一个中的1000个对象)并且手动运行查询(类似于产品中的查询)并对它们进行分析并且它们都运行< 2-4毫秒。

通过在线搜索/查看文档我无法弄清楚的两个大问题:

  1. 如何获取Mongoose在Mongo上运行的原始查询?
  2. 调用数据库进行数据访问的次数 - 例如,如果我在回调函数中有几个填充调用,排序调用和嵌套填充调用的查询,那么对服务器的访问次数是多少
  3. 以下是我看到的一些延迟时间:

    Login
    localhost + localDB = 58ms
    localhost + mongoHQ = 127ms
    heroku + mongoHQ = 287ms
    
    Get Data
    localhost + localDB = 281ms
    localhost + mongoHQ = 1657ms
    heroku + mongoHQ = 2190ms
    

    更新1

    我想出了如何记录查询并检查了一堆查询。我认为它会通过一堆填充调用进入一个查询 - 我注意到在生成查询的填充部分时,Mongoose输出一个Mongo查询,如:

    users.find({ _id: { '$in': [ ObjectId("531ec0e17c0b16a82be4f506"), 
    ObjectId("531ec0e17c0b16a82be4f506"), ObjectId("531ec0e17c0b16a82be4f506") ...
    

    其中id重复多次(在这种情况下是几百次) - 我认为这是导致减速和测试代码的原因我发现每个填充调用在请求时间增加了大约.3s-.5s 。填充调用也在数组字段上运行 - 这也保持了在100s内查询的id数量 - 低1000(重复)。

    有没有办法在进行填充调用时删除重复的条目?

1 个答案:

答案 0 :(得分:5)

尝试更改您的查询以使用“精简”选项,并查看时间量是否减少。这将绕过mongoose实体创建。

http://mongoosejs.com/docs/api.html#query_Query-lean