Du har ett kapslat dokument i det här fallet. Ditt dokument har ett fält Notification
som är en array som lagrar flera underobjekt med fältet url
. För att söka i ett underfält måste du använda punktsyntaxen:
BasicDBObject query=new BasicDBObject("Notification.url","www.adf.com");
Detta kommer dock att returnera hela dokumentet med hela Notification
array. Du vill förmodligen bara ha underdokumentet. För att filtrera detta måste du använda versionen med två argument av Collection.find
.
BasicDBObject query=new BasicDBObject("Notification.url","www.example.com");
BasicDBObject fields=new BasicDBObject("Notification.$", 1);
DBCursor f = con.coll.find(query, fields);
.$
betyder "endast den första posten i denna array som matchas av find-operatorn"
Detta bör fortfarande returnera ett dokument med en undergrupp Notifications
, men den här arrayen ska bara innehålla posten där url == "www.example.com"
.
För att gå igenom detta dokument med Java, gör så här:
BasicDBList notifications = (BasicDBList) f.next().get("Notification");
BasicDBObject notification = (BasicDBObject) notifications.get(0);
String url = notification.get("url");
Förresten: När din databas växer kommer du sannolikt att stöta på prestandaproblem, om du inte skapar ett index för att påskynda denna fråga:
con.coll.ensureIndex(new BasicDBObject("Notification.url", 1));