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.