La notación de puntos funciona bien cuando se usa dentro de un find filtro de consulta del método. Por ejemplo,
Document document = collection.find(Filters.eq("one.two", "three")).first();
System.out.println(document); // prints the returned document
o su mongo equivalente de shell:
db.collection.find( { "one.two": "three" } )
El Documento
get() de la clase método toma un Object (una clave de cadena) como parámetro y devuelve un Object .
Considere el código:
Document doc = coll.find(eq("data-id", "1234")).first();
System.out.println(doc);
La salida Document{{_id=1.0, data-id=1234, one=Document{{two=three}}}} muestra que hay tres claves:_id , data-id y one . Tenga en cuenta que no clave nombrada como one.two . La llave two está dentro del subdocumento del documento con la clave one .
Entonces, desde tu código:
document.get("one.two"); // This is null ((Document)
document.get("one")).get("two"); // Not null
La primera declaración devuelve null , y el siguiente devuelve three (el valor de la cadena). Ambos son correctos resultados y ese es el comportamiento del Document API de clase.
Debe usar el método getEmbedded para acceder al campo incrustado one.two . Entonces, reemplaza document.get("one.two") con
document.getEmbedded(Arrays.asList("one", "two"), String.class)
El resultado es "tres", como se esperaba.