V tomto případě máte vnořený dokument. Váš dokument obsahuje pole Notification
což je pole uchovávající více dílčích objektů s polem url
. Chcete-li hledat v dílčím poli, musíte použít syntaxi tečky:
BasicDBObject query=new BasicDBObject("Notification.url","www.adf.com");
Tím se však vrátí celý dokument s celým Notification
pole. Pravděpodobně budete chtít pouze dílčí dokument. Chcete-li to filtrovat, musíte použít verzi Collection.find se dvěma argumenty
.
BasicDBObject query=new BasicDBObject("Notification.url","www.example.com");
BasicDBObject fields=new BasicDBObject("Notification.$", 1);
DBCursor f = con.coll.find(query, fields);
The .$
znamená "pouze první záznam tohoto pole, který odpovídá operátoru find"
To by mělo stále vracet jeden dokument s podpolí Notifications
, ale toto pole by mělo obsahovat pouze položku, kde url == "www.example.com"
.
Chcete-li procházet tento dokument pomocí jazyka Java, postupujte takto:
BasicDBList notifications = (BasicDBList) f.next().get("Notification");
BasicDBObject notification = (BasicDBObject) notifications.get(0);
String url = notification.get("url");
Mimochodem: Když se vaše databáze rozroste, pravděpodobně narazíte na problémy s výkonem, pokud nevytvoříte index pro urychlení tohoto dotazu:
con.coll.ensureIndex(new BasicDBObject("Notification.url", 1));