2013-07-26 17 views
10

Jestem nowy w MongoDB. Mój przykładowy dokument jestZapytanie o dokumentację elementów tablicy w MongoDB za pomocą Java

{ 
    "Notification" : [ 
     { 
      "date_from" : ISODate("2013-07-08T18:30:00Z"), 
      "date_too" : ISODate("2013-07-30T18:30:00Z"), 
      "description" : "fdfd", 
      "url" : "www.adf.com" 
     }, 
     { 
      "date_from" : ISODate("2013-07-01T18:30:00Z"), 
      "date_too" : ISODate("2013-07-30T18:30:00Z"), 
      "description" : "ddddddddddd", 
      "url" : "www.pqr.com" 
     } 
    ], 

Próbuję aktualizacji powiadomień którego "url" : "www.adf.com". Mój kod Java, aby to zrobić:

BasicDBObject query=new BasicDBObject("url","www.adf.com"); 

DBCursor f = con.coll.find(query); 

Nie szukaj dokumentu, którego "url" jest "www.adf.com".

+0

Co to jest "con.coll"? –

+0

con jest obiekt połączenia –

+0

i co to jest 'coll'? –

Odpowiedz

13

Masz w tym przypadku zagnieżdżony dokument. Twój dokument ma pole Notification, które jest tablicą przechowującą wiele podobiektów w polu url. Aby wyszukać w sub-dziedzinie, trzeba korzystać z dot-składnię:

BasicDBObject query=new BasicDBObject("Notification.url","www.adf.com"); 

będzie to jednak powrót cały dokument z całego Notification tablicy. Prawdopodobnie potrzebujesz tylko pod-dokumentu. Aby odfiltrować to, musisz użyć the two-argument version of Collection.find.

BasicDBObject query=new BasicDBObject("Notification.url","www.example.com"); 
BasicDBObject fields=new BasicDBObject("Notification.$", 1); 

DBCursor f = con.coll.find(query, fields); 

The .$ means "only the first entry of this array which is matched by the find-operator"

Należy jeszcze zwrócić jeden dokument z sub-tablicy Notifications, ale macierz może zawierać tylko pozycję gdzie url == "www.example.com".

przemierzać ten dokument z Java, to zrobić:

BasicDBList notifications = (BasicDBList) f.next().get("Notification"); 
BasicDBObject notification = (BasicDBObject) notifications.get(0); 
String url = notification.get("url"); 

Przy okazji: Gdy baza rośnie będzie prawdopodobnie napotkasz problemy z wydajnością, chyba że utworzyć indeks przyspieszenia tej kwerendy:

con.coll.ensureIndex(new BasicDBObject("Notification.url", 1)); 
+0

Kiedy próbowałem uzyskać dostęp do "url" seprated przez powyższe zapytanie String s = (String) f.curr(). Get ("url"); Zwraca wartość null –

+0

@PrashantThorat Prawdopodobnie ponieważ zwrócony dokument nie ma adresu 'url' pola. Prawdopodobnie ma tylko pole "Powiadomienia", które zawiera DBList, który zawiera jeden obiekt DBObject, który zawiera pole 'url'. Sprawdź to w debugerze. – Philipp

+0

@ PrashantThorat 'f.curr(). Get (" Powiadomienia "). Get (0) .get (" url ")' może działać. – Philipp

Powiązane problemy