Vous avez un document imbriqué dans ce cas. Votre document a un champ Notification
qui est un tableau stockant plusieurs sous-objets avec le champ url
. Pour rechercher dans un sous-champ, vous devez utiliser la syntaxe à points :
BasicDBObject query=new BasicDBObject("Notification.url","www.adf.com");
Cependant, cela renverra l'intégralité du document avec l'intégralité de la Notification
déployer. Vous ne voulez probablement que le sous-document. Pour filtrer cela, vous devez utiliser la version à deux arguments 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);
Cela devrait toujours renvoyer un document avec un sous-tableau Notifications
, mais ce tableau ne doit contenir que l'entrée où url == "www.example.com"
.
Pour parcourir ce document avec Java, procédez comme suit :
BasicDBList notifications = (BasicDBList) f.next().get("Notification");
BasicDBObject notification = (BasicDBObject) notifications.get(0);
String url = notification.get("url");
Au fait : Lorsque votre base de données grossit, vous rencontrerez probablement des problèmes de performances, à moins que vous ne créiez un index pour accélérer cette requête :
con.coll.ensureIndex(new BasicDBObject("Notification.url", 1));