Mam kolekcję T
z 2 polami: Grade1
i Grade2
chcę wybrać te z warunkiem Grade1 > Grade2
, jak mogę uzyskać zapytanie, takie jak w MySQL?
Select * from T Where Grade1 > Grade2
Możesz użyć znaku $ gdzie. Pamiętaj tylko, że będzie to dość powolne (musi wykonać kod Javascript na każdym rekordzie), więc jeśli możesz, połącz je z indeksowanymi zapytaniami.
db.T.find( { $where: function() { return this.Grade1 > this.Grade2 } } );
lub bardziej zwarty:
db.T.find( { $where : "this.Grade1 > this.Grade2" } );
możesz użyć $expr
zgodnie z opisem w najnowszej odpowiedzi
$where: function() { return this.Grade1 - this.Grade2 > variable }
?db.T.find({$where: function() {return this.startDate == ISODate("2017-01-20T10:55:08.000Z");}});
, nic nie zwraca, nawet jeden z dokumentów w kolekcji toISODate("2017-01-20T10:55:08.000Z")
. Ale<=
i>=
wydaje się, że działa. dowolny pomysł?this.startDate.getTime() == ISODate("2017-01-20T10:55:08.000Z").getTime()
Możesz użyć $ expr (operator wersji 3.6 mongo), aby użyć funkcji agregujących w zwykłym zapytaniu.
Porównaj
query operators
zaggregation comparison operators
.Regularne zapytanie:
Zapytanie agregujące:
źródło
Jeśli zapytanie składa się tylko z
$where
operatora, możesz przekazać tylko wyrażenie JavaScript:Aby uzyskać większą wydajność, uruchom operację agregującą, która ma rozszerzenie
$redact
potok do filtrowania dokumentów spełniających podany warunek.$redact
Rurociąg łączy funkcjonalność$project
i$match
wdrożyć szczeblu terenowym redakcji, gdzie będzie powrotu wszystkich dokumentów pasujących warunek korzystania$$KEEP
i usuwa z wyników rurociągowych te, które nie pasują do siebie za pomocą$$PRUNE
zmiennej.Uruchomienie następującej operacji agregacji
$where
powoduje skuteczniejsze filtrowanie dokumentów niż używanie do dużych kolekcji, ponieważ wykorzystuje ona pojedynczy potok i natywne operatory MongoDB, a nie oceny JavaScript$where
, co może spowolnić zapytanie:który jest bardziej uproszczoną wersją włączenia dwóch rurociągów
$project
i$match
:Z MongoDB 3.4 i nowszymi:
źródło
W przypadku, gdy wydajność jest ważniejsza niż czytelność i jeśli twój warunek składa się z prostych operacji arytmetycznych, możesz użyć potoku agregacji. Najpierw użyj $ project do obliczenia lewej strony warunku (przenieś wszystkie pola do lewej strony). Następnie użyj $ match, aby porównać ze stałą i filtrem. W ten sposób unikniesz wykonywania javascript. Poniżej mój test w Pythonie:
Korzystanie z agregatu:
1 pętla, najlepiej 1: 192 ms na pętlę
Korzystanie z funkcji find i $ where:
1 pętla, najlepiej 1: 4,54 s na pętlę
źródło