Если ваш запрос состоит только из оператора $where
, вы можете передать только выражение JavaScript:
db.T.find("this.Grade1 > this.Grade2");
Для повышения производительности запустите агрегатную операцию с конвейером $redact
, чтобы отфильтровать документы, удовлетворяющие данному условию.
Трубопровод $redact
включает функции $project
и $match
для реализации редактирования на уровне поля, при котором он будет возвращать все документы, соответствующие условию, используя $$KEEP
и удаляет из конвейера результаты, которые не совпадают с использованием $$PRUNE
переменная.
Выполнение следующей агрегированной операции фильтрует документы более эффективно, чем использование $where
для больших коллекций, поскольку при этом используются единый конвейер и собственные операторы MongoDB, а не вычисления JavaScript с $where
, что может замедлить запрос:
db.T.aggregate([
{
"$redact": {
"$cond": [
{ "$gt": [ "$Grade1", "$Grade2" ] },
"$$KEEP",
"$$PRUNE"
]
}
}
])
, который является более упрощенным вариантом включения двух трубопроводов $project
и $match
:
db.T.aggregate([
{
"$project": {
"isGrade1Greater": { "$cmp": [ "$Grade1", "$Grade2" ] },
"Grade1": 1,
"Grade2": 1,
"OtherFields": 1,
...
}
},
{ "$match": { "isGrade1Greater": 1 } }
])
С MongoDB 3.4 и новее:
db.T.aggregate([
{
"$addFields": {
"isGrade1Greater": { "$cmp": [ "$Grade1", "$Grade2" ] }
}
},
{ "$match": { "isGrade1Greater": 1 } }
])