2013-02-13 2 views
0

У меня вопрос, мне нужно сравнить, если деление двух полей больше или равно некоторому значению. Таким образом, решение я нашел:

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

Но документы говорят, что использование $, где не хорошо для работы, потому что он будет работать яваскрипт функции, и терять индексы.

У кого-то есть лучшее решение для этого, которое не использует $ где?

Спасибо!

ответ

2

Вы можете перейти к каркасу агрегации здесь с использованием разрыва (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

Но документы говорят, что использование $, где это не хорошо для производительности, потому что он будет запускать функцию javascript и теряет индексы

Вы не можете использовать индекс для этого в любом случае нет возможности использовать индекс для математических функций, подобных этому. Главное, что JS-движок до 16 раз медленнее обычного запроса, структура агрегации должна быть быстрее. Не только это, но и блокировка JS является глобальной для всех запросов.

Конечно, самый быстрый способ состоит в том, чтобы предварительно суммировать эту сумму в другое поле при изменении записи в приложении, тогда вам не понадобится ни одно из этого, просто обычный запрос.

+0

Спасибо человеку, это решение решило мою проблему. Приветствия! – Brayan