- O erro de sintaxe ocorre porque você precisa usar aspas em
services.port_info
- No entanto,
$elemMatch
em campos aninhados não é compatível no momento mesmo assim - Felizmente, você não precisa de
$elemMatch
para este tipo de consulta
Isso deve fazer:
db.hosts.find({ ip : "127.0.0.1"}, { "services.port_info.product" : "ssh" });
$elemMatch
é necessário se você quiser corresponder a vários critérios dentro do objeto de matriz, por exemplo, "encontrar tudo onde a porta é 9000 e o protocolo é UDP". Isso não seria compatível com sua estrutura de dados. Não sei por que port_info
é um array de objetos (talvez para situações incertas onde uma porta pode pertencer a dois serviços diferentes?) - se fosse um único objeto, até mesmo o $elemMatch
seria suportado. Além disso, lembre-se de que essa consulta sempre retornará o objeto inteiro.