- Błąd składni jest spowodowany tym, że musisz użyć cudzysłowów wokół
services.port_info - Jednak
$elemMatchw polach zagnieżdżonych jest obecnie nieobsługiwany w każdym razie - Na szczęście nie potrzebujesz
$elemMatchdla 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.