【问题标题】:Replace the use of $where in MongoDB替换 MongoDB 中 $where 的使用
【发布时间】:2013-02-13 19:08:53
【问题描述】:

我有一个问题,我需要比较两个字段的除法是否大于或等于某个值。所以我找到的解决方案是:

{
    "$where": "this.total / this.limit > 0.6"
}

但是文档说使用 $where 对性能不利,因为它会运行一个 javascript 函数,并丢失索引。

是否有人对此有更好的解决方案,不使用 $where?

谢谢!

【问题讨论】:

    标签: mongodb mongodb-query mongodb-php nosql


    【解决方案1】:

    您可以使用除法 (http://docs.mongodb.org/manual/reference/aggregation/#_S_divide) 移至此处的聚合框架:

    db.col.aggregate([
        {$match: {_id: whatever_or_whatever_clause_you_want}},
        {$project: {
            // Your document fields
            divided_limit: {$divide: ['$total', '$limit']}
        }},
        {$match: {divided_limit: {$gt: 0.6}}}
    ]);
    

    注意:聚合框架是 v2.1 之后的新版本

    但是文档说使用 $where 对性能不好,因为它会运行一个 javascript 函数,并丢失索引

    无论如何,您不能为此使用索引,没有办法为这样的数学函数使用索引。关键是 JS 引擎比普通查询慢了 16X,聚合框架应该更快。不仅如此,JS 锁对于所有查询都是全局的。

    当然,最快的方法是在修改应用程序中的记录时将此总和预聚合到另一个字段中,然后您将不需要任何这些,只需一个普通查询即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-24
      • 1970-01-01
      • 2017-07-11
      相关资源
      最近更新 更多