MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Documents imbriqués MongoDB Java non accessibles à l'aide de points dans le nom de la clé

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.