Korzystanie z $where
W większości przypadków należy unikać operatora, ponieważ oba wywołają pełne skanowanie kolekcji bez względu na to, jakie inne warunki mogłyby ewentualnie wykorzystać wybór indeksu.
Dodatkowo wywołujesz interpreter JavaScript nad każdym dokumentem wynikowym, który będzie znacznie wolniejszy niż kod natywny. Przeczytaj ostrzeżenia na stronie podręcznika, są tam z jakiegoś powodu
Jeśli to możliwe, spróbuj użyć .aggregate()
dla tego typu porównania zamiast. W Twoim przypadku jest to zdecydowanie lepsza opcja:
db.foo.aggregate([
{ "$match": { "flag": true } },
{ "$unwind": "$versions" },
{ "$project": {
"versions": "$versions"
"same": { "$eq": [ "$versions.version", "$defaultVersion" ] }
}}
{ "$match": { "same": true } },
{ "$project": {
"_id": 0,
"versions": 1
}}
])
Pozwala to najpierw przefiltrować zapytanie według warunku „flaga”, a następnie sprawdzić każdy element tablicy w celu porównania, czy oba pola są takie same.
Jeśli to konieczne, możesz następnie przywrócić dopasowane elementy tablicy do tablicy, w której jest więcej niż jedno dopasowanie. Ale nie sądzę, żeby to było twoje wymaganie.