Чтобы избежать JavaScript, используйте структуру агрегации:
db.myCollection.aggregate([
{"$match":{"a1":{"$exists":true},"a2":{"$exists":true}}},
{"$project": {
"a1":1,
"a2":1,
"aCmp": {"$cmp":["$a1.a","$a2.a"]}
}
},
{"$match":{"aCmp":0}}
])
На нашем сервере разработки эквивалентный запрос JavaScript выполняется в 7 раз дольше.
Обновление (10 мая 2017 г.)
Я только что понял, что мой ответ не отвечает на вопрос, в котором нужны значения, которые не равны (иногда я действительно медленный).Это будет работать для этого:
db.myCollection.aggregate([
{"$match":{"a1":{"$exists":true},"a2":{"$exists":true}}},
{"$project": {
"a1":1,
"a2":1,
"aEq": {"$eq":["$a1.a","$a2.a"]}
}
},
{"$match":{"aEq": false}}
])
$ne
может использоваться вместо $eq
, если условие соответствия было изменено на true
, но я считаю, что использование $eq
с false
должно бытьболее интуитивно понятный.