MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

MongoDB Java вложени документи не са достъпни чрез точки в името на ключа

Точковата нотация работи добре, когато се използва в рамките на find филтър за заявка на метода. Например,

Document document = collection.find(Filters.eq("one.two", "three")).first();
System.out.println(document);    // prints the returned document

или неговия mongo еквивалент на обвивката:

db.collection.find( { "one.two": "three" } )


Документ get() на класа методът приема Object (ключ String) като параметър и връща Object .

Помислете за кода:

Document doc = coll.find(eq("data-id", "1234")).first();
System.out.println(doc);

Изходът Document{{_id=1.0, data-id=1234, one=Document{{two=three}}}} показва, че са три ключове:_id , data-id и one . Имайте предвид, че не ключ с име като one.two . Ключът two е в поддокумента на документа с ключа one .

И така, от вашия код:

document.get("one.two");    // This is null ((Document)
document.get("one")).get("two"); // Not null

Първият израз връща null , а следващият връща three (стойността на низа). И двете са правилни резултати и това е поведението на Document клас API.

Трябва да използвате метода getEmbedded за достъп до вграденото поле one.two . Така че, заменете document.get("one.two") с

document.getEmbedded(Arrays.asList("one", "two"), String.class)

Резултатът е "три", както се и очакваше.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB - Заявка към последния елемент от масив?

  2. Четенето на DBname.system.indexes се провали в клъстера Atlas от mongobee след свързване

  3. Внедряването на Strapi Heroku не успява да се свърже с MongoDB

  4. MongoDB GridFS VS Директно диск IO

  5. Вградени или препратени релации