【问题标题】:Mongodb javascript expressions and $whereMongodb javascript表达式和$where
【发布时间】:2012-01-16 01:19:54
【问题描述】:

在 mongodb 查询中使用 javascript 表达式而不是标准 BSON 表示法是否会对性能产生影响。例如:

>db.myCollection.find( { a : { $gt: 3 } } );
>db.myCollection.find( { $where: "this.a > 3" } );

如果列上没有索引,第一个查询会比第二个查询快吗?另外,有没有办法写查询

>db.myCollection.find( { $where: "this.a / 10 > 3" } );

>db.myCollection.find( { $where: "this.a / this.b > 3" } );

不使用 $where 符号?

【问题讨论】:

    标签: javascript mongodb performance database


    【解决方案1】:

    如果列上没有索引,第一个查询会比第二个查询快吗?

    在这两种情况下,第一个基本上总是会更快。 $where 子句将使用 javascript 引擎。每个实例只能运行一个 javascript 引擎,因此可能需要等待。此外,$where 子句必须将对象移入和移出 javascript VM,这会增加开销并且速度会变慢。

    另外,有什么方法可以在不使用 $where 表示法的情况下编写查询....find( { $where: "this.a / this.b > 3" } );

    这里的答案是。查询引擎不支持任何比较对象内数据的查询。这里唯一的解决方法是:

    1. 预先计算列(我确定您会尽量避免
    2. 在某处运行for 循环并“手动”执行此操作。这可以通过 Map/Reduce 或客户端查询来完成。

    当然,这两种解决方案都不是最优的。这绝对是 MongoDB 功能的一个整体。

    【讨论】:

      【解决方案2】:

      从这里:

      http://www.mongodb.org/display/DOCS/Server-side+Code+Execution#Server-sideCodeExecution-%7B%7B%24where%7D%7DClausesandFunctionsinQueries

      “注意:如果可以使用普通的数据驱动的 BSON 查询表达式,请使用该构造。仅在必须时使用 $where,它会显着变慢。”

      关于你的第二个问题:你能做到吗

      { a : { $gt: 0.3 } }
      

      【讨论】:

      • 谢谢,看看我对第二个问题的更新,第一个问题有点琐碎。关键是,我如何在组合多个文档属性或对其中一些属性执行操作时进行查询(例如在关系数据库中构建计算列)。
      【解决方案3】:

      “Javascript 的执行速度比本页列出的本地运算符慢,但非常灵活。有关详细信息,请参阅服务器端处理页面。”

      有关详细信息,请参阅以下内容: http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-JavascriptExpressionsand%7B%7B%24where%7D%7D

      【讨论】:

        猜你喜欢
        • 2019-09-18
        • 2015-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-25
        相关资源
        最近更新 更多