Odpowiedź opublikowana przez @AnthonyWinzlet ma tę wadę, że musi przerzucić wszystkie dokumenty w kolekcji użytkowników i wykonać $lookup
s, co jest stosunkowo kosztowne. Tak więc w zależności od rozmiaru Twoich Users
kolekcji może to być szybsze:
- Umieść indeks na
users.pet
iusers.car
:db.users.createIndex({pet: 1, car: 1})
- Umieść indeks na
cars.model
:db.cars.createIndex({model: 1})
- Umieść indeks na
pets.name
:db.pets.createIndex({name: 1})
Następnie możesz po prostu zrobić to:
- Pobierz listę wszystkich pasujących
"Tesla"
samochody:db.cars.find({model: "Tesla"})
- Pobierz listę wszystkich pasujących
"Mickey"
zwierzęta:db.pets.find({name: "Mickey"})
- Znajdź użytkowników, którymi jesteś zainteresowany:
db.users.find({car: { $in: [<ids from cars query>] }, pet: { $in: [<ids from pets query>] }})
Jest to dość łatwe do odczytania i zrozumienia, a wszystkie trzy zapytania są w pełni objęte indeksami, więc można oczekiwać, że będą tak szybkie, jak to tylko możliwe.