Вам необходимо передать $where
Функция как строка, а не как фактическая функция. Это необходимо для Mongo для обработки и запуска функции (она не выполняется в Node.js). Следуйте этому forum thread для получения дополнительной информации об этом.
Таким образом изменить ваш запрос
Tickers.find({"$where": "function() { return (this.price < this.value); }"})
или просто передать в сравнении строк
Tickers.find("this.price < this.value");
Однако, имейте в виду, что это не будет perfom очень хорошо, так как с помощью оператора в $where
вызывает JavaScript-движок для оценки кода Javascript на каждом документе и проверки условий для каждого. Целесообразно комбинировать с индексированными запросами, если вы можете так, чтобы запрос мог быть быстрее.
Некоторые considerations вы должны смотреть на при использовании $where
:
Не использовать глобальные переменные.
$where
оценивает JavaScript и не может использовать индексы. Поэтому производительность запросов улучшается, когда вы выражаете ваш запрос используя стандартные операторы MongoDB (например, $gt
, $in
). В общем, вы должны использовать $where
только если вы не можете выразить свой запрос, используя другой оператор . Если вы должны использовать $where
, попробуйте включить стандартный оператор запроса для фильтрации набора результатов. Использование $where
требует сканирования таблицы.Используя нормальные Непро- $where
операторов запросов обеспечивают следующие эксплуатационные преимущества:
MongoDB будет оценивать Непро- $where
компонентов запроса перед тем $where
заявления. Если заявления не соответствуют никаким документам, MongoDB не будет выполнять оценку какого-либо вопроса, используя $where
. Операторы запроса могут использовать индекс.
Еще одно предложение, что позволяет избежать использования оператора в $where
бы создать дополнительный вычисляемый денормализованным поле сказать price_difference
, что разница между ценой и стоимостью (стоимость - цена), которые затем можно запросить как:
Tickers.find({ "price_difference": { "$gt": 0 }});
Но все же такие поля с низкой степенью селективности не дают хорошей производительности индекса, если коллекция очень велика, поэтому кандидат, установленный для индексирования, является большим с этим подходом.
Можете ли вы уточнить, как это не сработало? Получаете ли вы ошибку или неправильное значение? – terrafirma9