慢的猫鼬请求

N V*_*N V 2 mongoose mongodb node.js

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

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

  1. 如何获取Mongoose在Mongo上运行的原始查询?
  2. 调用db会有多少次访问数据库 - 例如,如果我在回调函数中有几个填充调用,排序调用和嵌套填充调用的查询,那么对服务器的访问次数是多少.

这是我看到的一些延迟时间:

Login
localhost + localDB = 58ms
localhost + mongoHQ = 127ms
heroku + mongoHQ = 287ms

Get Data
localhost + localDB = 281ms
localhost + mongoHQ = 1657ms
heroku + mongoHQ = 2190ms
Run Code Online (Sandbox Code Playgroud)

更新1

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

users.find({ _id: { '$in': [ ObjectId("531ec0e17c0b16a82be4f506"), 
ObjectId("531ec0e17c0b16a82be4f506"), ObjectId("531ec0e17c0b16a82be4f506") ...
Run Code Online (Sandbox Code Playgroud)

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

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

Wil*_*ver 5

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

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