La notazione del punto funziona bene se utilizzata all'interno di un find filtro di query del metodo. Ad esempio,
Document document = collection.find(Filters.eq("one.two", "three")).first();
System.out.println(document); // prints the returned document
o il suo mongo equivalente della shell:
db.collection.find( { "one.two": "three" } )
Il Documento
get() della classe il metodo accetta un Object (una chiave String) come parametro e restituisce un Object .
Considera il codice:
Document doc = coll.find(eq("data-id", "1234")).first();
System.out.println(doc);
L'output Document{{_id=1.0, data-id=1234, one=Document{{two=three}}}} mostra che ce ne sono tre chiavi:_id , data-id e one . Nota che non c'è no chiave denominata one.two . La chiave two è all'interno del sotto-documento del documento con la chiave one .
Quindi, dal tuo codice:
document.get("one.two"); // This is null ((Document)
document.get("one")).get("two"); // Not null
La prima istruzione restituisce null e il successivo restituisce three (il valore Stringa). Entrambi sono corretti risultati e questo è il comportamento del Document API di classe.
Dovresti usare il metodo getEmbedded per accedere al campo incorporato one.two . Quindi, sostituisci document.get("one.two") con
document.getEmbedded(Arrays.asList("one", "two"), String.class)
Il risultato è "tre", come previsto.