【发布时间】:2016-05-23 03:40:28
【问题描述】:
我的 Mongoose 查询一直很慢。我已将其缩小为 Mongoose 创建对象的方式或数据库服务器请求中的实际延迟。我在数据库中几乎没有任何数据(4 个集合中的每个集合中的对象均
通过在线搜索/查看文档我无法弄清楚的两个大问题:
- 如何获取 Mongoose 在 Mongo 上运行的原始查询?
- 一个调用对数据库服务器进行了多少次调用 - 例如,如果我有一个查询,其中包含几个填充调用、一个排序调用和回调函数中的一个嵌套填充调用,那么该调用对服务器进行了多少次调用.
这是我看到的一些延迟时间:
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 的请求时间.填充调用也在一个数组字段上运行 - 这也将要查询的 id 数量保持在 100 秒内 - 低 1000 个(重复)。
有没有办法在进行填充调用时删除重复的条目?
【问题讨论】:
-
你能用 mongo 控制台连接到其中一个实例,看看它们在直接连接时是否反应迟缓?我无法想象你发布的时间不能用猫鼬对象数量来解释,除非它有数万。
-
@WiredPrairie 看起来不错 - 当我运行登录用户测试时(见上文),连接到远程 db 127ms 时速度非常快
-
@WiredPrairie 我做了一些调查,你认为这可能是因为 populate 调用中有很多参数吗?
-
它可能是......您可能只想推出自己的解决方案,至少在实验上(收集
_ids,没有重复,看看会发生什么)。 -
自己组装物品? kk我试试看