带有 Node.JS 的 MongoDB:$where 子句性能

Posted

技术标签:

【中文标题】带有 Node.JS 的 MongoDB:$where 子句性能【英文标题】:MongoDB with Node.JS: $where clause performance 【发布时间】:2015-04-11 17:28:39 【问题描述】:

我没有使用 mongoose,而是使用 Node.js 的官方 MongoDB 驱动程序,因为它不强制定义模式。

我在官方文档中读到,通过 $where 子句,您可以使用 javascript 函数进行查询以提高灵活性,对于一些相当复杂的查询我有点需要,但它究竟对性能有何影响?你们有人试过吗?我担心部署在 Mongolab 沙箱上的 100,000 到 200,000 个文档的集合会出现问题

真正的问题是,它真的会成为网站响应时间的问题吗?

谢谢

【问题讨论】:

【参考方案1】:

您的担心是对的,因为$where 是最后的查询运算符,只有在您的查询无法使用其他运算符表示时才应使用。

来自the docs:

$where 评估 JavaScript 并且不能利用索引。因此,当您表达查询时,查询性能会提高 使用标准 MongoDB 运算符(例如,$gt$in)。 一般来说,只有在无法使用其他运算符表达查询时才应使用 $where。如果您必须使用$where,请尝试 包括至少一个其他标准查询运算符来过滤 结果集。单独使用 $where 需要进行表扫描。

所以是的,$where 查询性能很可能在您的情况下不足。最好设计您的架构,以便在不需要 $where 的情况下执行所有所需的查询。

【讨论】:

我也阅读了文档,这就是我担心的原因,我只是想知道是否有人尝试过并发现了实际的显着差异。无论如何,我想出了一种方法来使用 MongoDB 运算符:) 批准您的答案,因为您是唯一可以提供帮助的人,因此任何搜索此内容的人都可以看到引用和文档链接 @CyborgFish 肯定会慢一些,但是慢多少取决于查询的具体情况。只需使用您自己的查询自己尝试一下,看看您的情况有何不同。

以上是关于带有 Node.JS 的 MongoDB:$where 子句性能的主要内容,如果未能解决你的问题,请参考以下文章

带有 Node Js 的 Mongodb

带有承诺的 MongoDB 查询不执行 if 语句(MongoDB node.js 驱动程序)

从 Node.js 向 MongoDB 集合插入不同类型的值

Node.js(&MongoDB) 服务器崩溃,数据库操作中途?

Node.js(&MongoDB) 服务器崩溃,数据库操作中途?

如何在 node.js 和 mongoDB 本机驱动程序上启用调试?