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));