W tym przypadku masz zagnieżdżony dokument. Twój dokument ma pole Notification
która jest tablicą przechowującą wiele podobiektów z polem url
. Aby wyszukiwać w podpolu, musisz użyć składni kropki:
BasicDBObject query=new BasicDBObject("Notification.url","www.adf.com");
Spowoduje to jednak zwrócenie całego dokumentu z całym Notification
szyk. Prawdopodobnie potrzebujesz tylko poddokumentu. Aby to odfiltrować, musisz użyć dwuargumentowej wersji Collection.find
.
BasicDBObject query=new BasicDBObject("Notification.url","www.example.com");
BasicDBObject fields=new BasicDBObject("Notification.$", 1);
DBCursor f = con.coll.find(query, fields);
.$
oznacza "tylko pierwszy wpis tej tablicy, który jest dopasowany przez operatora wyszukiwania"
Powinno to zwrócić jeden dokument z podtablicą Notifications
, ale ta tablica powinna zawierać tylko wpis gdzie url == "www.example.com"
.
Aby przeglądać ten dokument w Javie, wykonaj następujące czynności:
BasicDBList notifications = (BasicDBList) f.next().get("Notification");
BasicDBObject notification = (BasicDBObject) notifications.get(0);
String url = notification.get("url");
Przy okazji: Gdy baza danych się rozrośnie, prawdopodobnie napotkasz problemy z wydajnością, chyba że utworzysz indeks, aby przyspieszyć to zapytanie:
con.coll.ensureIndex(new BasicDBObject("Notification.url", 1));