- Lỗi cú pháp là do bạn phải sử dụng dấu ngoặc kép xung quanh
services.port_info
- Tuy nhiên,
$elemMatch
trong các trường lồng nhau hiện không được hỗ trợ dù sao thì - May mắn thay, bạn không cần
$elemMatch
cho loại truy vấn này
Điều này nên làm:
db.hosts.find({ ip : "127.0.0.1"}, { "services.port_info.product" : "ssh" });
$elemMatch
là bắt buộc nếu bạn muốn so khớp nhiều tiêu chí bên trong đối tượng mảng, ví dụ:"tìm tất cả nơi có cổng là 9000 và giao thức là UDP". Điều đó sẽ không được hỗ trợ với cấu trúc dữ liệu của bạn. Tôi không chắc tại sao port_info
là một mảng các đối tượng (có thể đối với các vị trí không chắc chắn trong đó một cổng có thể thuộc về hai dịch vụ khác nhau?) - nếu đó là một đối tượng, ngay cả $elemMatch
sẽ được hỗ trợ.
Ngoài ra, hãy nhớ rằng một truy vấn như vậy sẽ luôn trả về toàn bộ đối tượng.