0

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

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

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

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

谢谢 !

4

1 回答 1

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

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

于 2013-02-13T19:24:51.377 回答