- Błąd składni jest spowodowany tym, że musisz użyć cudzysłowów wokół
services.port_info
- Jednak
$elemMatch
w polach zagnieżdżonych jest obecnie nieobsługiwany w każdym razie - Na szczęście nie potrzebujesz
$elemMatch
dla tego rodzaju zapytania
To powinno wystarczyć:
db.hosts.find({ ip : "127.0.0.1"}, { "services.port_info.product" : "ssh" });
$elemMatch
jest wymagane, jeśli chcesz dopasować wiele kryteriów wewnątrz obiektu tablicy, na przykład „znajdź wszystko, gdzie port to 9000, a protokół to UDP”. To byłoby nieobsługiwane przez twoją strukturę danych. Nie wiem, dlaczego port_info
jest tablicą obiektów (może w niepewnych sytuacjach, w których port może należeć do dwóch różnych usług?) - gdyby był to pojedynczy obiekt, nawet $elemMatch
będą obsługiwane.
Pamiętaj też, że takie zapytanie zawsze zwróci cały obiekt.