В този случай имате вложен документ. Вашият документ има поле Notification
което е масив, съхраняващ множество подобекти с полето url
. За да търсите в подполе, трябва да използвате синтаксиса за точка:
BasicDBObject query=new BasicDBObject("Notification.url","www.adf.com");
Това обаче ще върне целия документ с цялото Notification
масив. Вероятно искате само поддокумента. За да филтрирате това, трябва да използвате версията с два аргумента на Collection.find
.
BasicDBObject query=new BasicDBObject("Notification.url","www.example.com");
BasicDBObject fields=new BasicDBObject("Notification.$", 1);
DBCursor f = con.coll.find(query, fields);
.$
означава "само първият запис от този масив, който съответства на оператора за намиране"
Това все пак трябва да върне един документ с подмасив Notifications
, но този масив трябва да съдържа само записа, където url == "www.example.com"
.
За да преминете през този документ с Java, направете следното:
BasicDBList notifications = (BasicDBList) f.next().get("Notification");
BasicDBObject notification = (BasicDBObject) notifications.get(0);
String url = notification.get("url");
Между другото: Когато вашата база данни нарасне, вероятно ще срещнете проблеми с производителността, освен ако не създадете индекс, за да ускорите тази заявка:
con.coll.ensureIndex(new BasicDBObject("Notification.url", 1));