javascript - Mongo 查询在大数据库上引发超时

标签 javascript angular mongodb mongoose

我是 mongo 和 Angular 的新手,我刚刚解决了一个本地 mongo 数据库的问题,并且我能够在一个小型数据库上执行查询;现在我尝试在 210GB 的大数据库上进行查询,但每次执行查询时,即使我按 1 条记录进行过滤,也会出现超时。

我有什么遗漏吗?

这是我正在使用的查询

let q = 'ClientID : 18481';

await Activities.find({q}, function(err, users){
            if (err) throw err;
            // object of all the users
            console.log(users);
        }, 20000);

这也是我与 Jasmine 相关的 Protractor 配置

  jasmineNodeOpts: {
    showColors: true,
    defaultTimeoutInterval: 300000,
    allScriptsTimeout: 300000,
    isVerbose: true
  },

这是我得到的输出

Failures:
1) dashboard_links update time frame filter to Today
  Message:
    Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
  Stack:
    Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
        at listOnTimeout (timers.js:327:15)
        at processTimers (timers.js:271:5)
  Message:
    MongoNetworkError: connection 0 to server.qa.test.online:27017 timed out
  Stack:
    MongoNetworkError: connection 0 to server.qa.test.online:27017 timed out
        at Socket.<anonymous> (/Users/moisessiles/Automation/node_modules/mongoose/node_modules/mongodb-core/lib/connection/connection.js:259:7)
        at Object.onceWrapper (events.js:285:13)
        at Socket.emit (events.js:197:13)
        at Socket._onTimeout (net.js:447:8)
        at listOnTimeout (timers.js:327:15)
        at processTimers (timers.js:271:5)
  Message:
    Failed: connection 1 to server.qa.test.online:27017 timed out
  Stack:
    MongoNetworkError: connection 1 to server.qa.test.online:27017 timed out
        at Socket.<anonymous> (/Users/moisessiles/Automation/node_modules/mongoose/node_modules/mongodb-core/lib/connection/connection.js:259:7)
        at Object.onceWrapper (events.js:285:13)
        at Socket.emit (events.js:197:13)
        at Socket._onTimeout (net.js:447:8)
        at listOnTimeout (timers.js:327:15)
        at processTimers (timers.js:271:5)
    From: Task: Run it("update time frame filter to Today") in control flow
        at UserContext.<anonymous> (/Users/moisessiles/Automation/node_modules/jasminewd2/index.js:94:19)
        at /Users/moisessiles/Automation/node_modules/jasminewd2/index.js:64:48
        at ControlFlow.emit (/Users/moisessiles/Automation/node_modules/selenium-webdriver/lib/events.js:62:21)
        at ControlFlow.shutdown_ (/Users/moisessiles/Automation/node_modules/selenium-webdriver/lib/promise.js:2674:10)
        at shutdownTask_.MicroTask (/Users/moisessiles/Automation/node_modules/selenium-webdriver/lib/promise.js:2599:53)
        at MicroTask.asyncRun (/Users/moisessiles/Automation/node_modules/selenium-webdriver/lib/promise.js:2728:9)
        at /Users/moisessiles/Automation/node_modules/selenium-webdriver/lib/promise.js:668:7
        at processTicksAndRejections (internal/process/next_tick.js:81:5)
    From asynchronous test: ```

最佳答案

您的实际问题是查询需要那么长时间。查看您的查询:

 { q:  'ClientID : 18481' }

您真的需要在字段 q 中包含一个带有名称的字符串吗?难道你不能将你的对象构造为:

 { clientID: 18481 }

然后您将查询一个数字,这样速度更快,并且可以保持数据库干净。这样您还可以轻松创建 index对于该字段:

Activities.index({ clientID: 1 })

这会将您的搜索转变为查找

210GB

如此大量的数据是如何获得的?尝试构建数据(如上所示),通过让 mongodb 更优雅地存储数据来减少数据库的大小。

另请记住,数据库必须在 RAM 中存储大量数据才能快速运行,如果您的服务器无法处理这么多数据,您可能需要 shard您的数据跨多个服务器。

如果所有这些都不能帮助减少超时下的加载时间,您可以 increase / disable the timeout .

关于javascript - Mongo 查询在大数据库上引发超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55559621/

相关文章:

javascript - 使用自定义键将数组转换为对象

javascript - 从 MongoDB 中的日期集合中获取不同的日期

angular - Apollo Angular GraphQL 代码生成。从单个 schema.graphqls 文件生成查询和突变

mongodb - 组合文字go中缺少类型,而map文字go中缺少键

node.js - 查询 MongoDB 中以 YYYY-MM-DD 格式保存的日期的最佳方法是什么?

javascript - div 中 HTML/CSS 标题的简单编码问题

javascript - [c3.js]如何onclick/onmouseover到图例然后显示工具提示?

javascript - 带有 Knockout.js 的 MVVM

angular - 在 Angular 模型中转换对象的更好方法

javascript - 在 angular js 2.0 中处理 CCAvenue 响应