Você tem um documento aninhado neste caso. Seu documento tem um campo
Notification
que é um array armazenando vários subobjetos com o campo url
. Para pesquisar em um subcampo, você precisa usar a sintaxe de ponto:BasicDBObject query=new BasicDBObject("Notification.url","www.adf.com");
Isso, no entanto, retornará todo o documento com toda a
Notification
variedade. Você provavelmente quer apenas o subdocumento. Para filtrar isso, você precisa usar a versão de dois argumentos de Collection.find
. BasicDBObject query=new BasicDBObject("Notification.url","www.example.com");
BasicDBObject fields=new BasicDBObject("Notification.$", 1);
DBCursor f = con.coll.find(query, fields);
O
.$
significa "apenas a primeira entrada desta matriz que corresponde ao operador de localização"
Isso ainda deve retornar um documento com uma sub-matriz
Notifications
, mas esta matriz deve conter apenas a entrada onde url == "www.example.com"
. Para percorrer este documento com Java, faça o seguinte:
BasicDBList notifications = (BasicDBList) f.next().get("Notification");
BasicDBObject notification = (BasicDBObject) notifications.get(0);
String url = notification.get("url");
A propósito: Quando seu banco de dados crescer, você provavelmente terá problemas de desempenho, a menos que crie um índice para acelerar essa consulta:
con.coll.ensureIndex(new BasicDBObject("Notification.url", 1));