MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Documentos aninhados do MongoDB Java não acessíveis usando pontos no nome da chave


A notação de ponto funciona bem quando usada dentro de um find filtro de consulta do método. Por exemplo,
Document document = collection.find(Filters.eq("one.two", "three")).first();
System.out.println(document);    // prints the returned document

ou seu mongo equivalente do escudo:
db.collection.find( { "one.two": "three" } )




O Documento get() da classe O método recebe um Object (uma chave String) como parâmetro e retorna um Object .

Considere o código:
Document doc = coll.find(eq("data-id", "1234")).first();
System.out.println(doc);

A saída Document{{_id=1.0, data-id=1234, one=Document{{two=three}}}} mostra que há três chaves:_id , data-id e one . Observe que não chave chamada one.two . A chave two está dentro do sub-documento do documento com a chave one .

Então, do seu código:
document.get("one.two");    // This is null ((Document)
document.get("one")).get("two"); // Not null

A primeira instrução retorna null , e o próximo retorna three (o valor String). Ambos estão corretos resultados e esse é o comportamento do Document API de classe.

Você deve usar o método getEmbedded para acessar o campo incorporado one.two . Então, substitua document.get("one.two") com
document.getEmbedded(Arrays.asList("one", "two"), String.class)

O resultado é "três", como esperado.