sql >> Base de Datos >  >> NoSQL >> MongoDB

Los documentos anidados de MongoDB Java no son accesibles mediante puntos en el nombre de la clave

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.