替换MongoDB中$ where的使用

时间:2013-02-13 19:08:53

标签: mongodb mongodb-query mongodb-php nosql

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

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

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

有人有更好的解决方案,不使用$ where吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

您可以使用divide(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引擎比普通查询慢16倍,聚合框架应该更快。不仅如此,JS锁对于所有查询都是全局的。

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