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.