In diesem Fall haben Sie ein verschachteltes Dokument. Ihr Dokument hat ein Feld Notification
Dies ist ein Array, das mehrere Unterobjekte mit dem Feld url
speichert . Um in einem Unterfeld zu suchen, müssen Sie die Punktsyntax verwenden:
BasicDBObject query=new BasicDBObject("Notification.url","www.adf.com");
Dadurch wird jedoch das gesamte Dokument mit der gesamten Notification
zurückgegeben Reihe. Sie möchten wahrscheinlich nur das Unterdokument. Um dies zu filtern, müssen Sie die Version mit zwei Argumenten von Collection.find
verwenden .
BasicDBObject query=new BasicDBObject("Notification.url","www.example.com");
BasicDBObject fields=new BasicDBObject("Notification.$", 1);
DBCursor f = con.coll.find(query, fields);
Der .$
bedeutet "nur der erste Eintrag dieses Arrays, auf den der find-Operator passt"
Dies sollte immer noch ein Dokument mit einem Unterarray Notifications
zurückgeben , aber dieses Array sollte nur den Eintrag enthalten, wobei url == "www.example.com"
.
Gehen Sie wie folgt vor, um dieses Dokument mit Java zu durchlaufen:
BasicDBList notifications = (BasicDBList) f.next().get("Notification");
BasicDBObject notification = (BasicDBObject) notifications.get(0);
String url = notification.get("url");
Übrigens: Wenn Ihre Datenbank wächst, werden Sie wahrscheinlich auf Leistungsprobleme stoßen, es sei denn, Sie erstellen einen Index, um diese Abfrage zu beschleunigen:
con.coll.ensureIndex(new BasicDBObject("Notification.url", 1));