La notation par points fonctionne bien lorsqu'elle est utilisée dans un find filtre de requête de la méthode. Par exemple,
Document document = collection.find(Filters.eq("one.two", "three")).first();
System.out.println(document); // prints the returned document
ou son mongo équivalent shell :
db.collection.find( { "one.two": "three" } )
Le Document
get() de la classe la méthode prend un Object (une clé String) en tant que paramètre et renvoie un Object .
Considérez le code :
Document doc = coll.find(eq("data-id", "1234")).first();
System.out.println(doc);
La sortie Document{{_id=1.0, data-id=1234, one=Document{{two=three}}}} montre qu'il y en a trois clés :_id , data-id et one . Notez qu'il n'y a non clé nommée one.two . La clé two est dans le sous-document du document avec la clé one .
Donc, à partir de votre code :
document.get("one.two"); // This is null ((Document)
document.get("one")).get("two"); // Not null
La première instruction renvoie null , et le suivant renvoie three (la valeur de chaîne). Les deux sont corrects résultats et c'est le comportement du Document API de classe.
Vous devez utiliser la méthode getEmbedded pour accéder au champ intégré one.two . Donc, remplacez document.get("one.two") avec
document.getEmbedded(Arrays.asList("one", "two"), String.class)
Le résultat est "trois", comme prévu.