Anda memiliki dokumen bersarang dalam kasus ini. Dokumen Anda memiliki bidang Notification
yang merupakan larik yang menyimpan beberapa sub-objek dengan bidang url
. Untuk mencari di sub-bidang, Anda perlu menggunakan sintaks titik:
BasicDBObject query=new BasicDBObject("Notification.url","www.adf.com");
Namun, ini akan mengembalikan seluruh dokumen dengan seluruh Notification
Himpunan. Anda mungkin hanya menginginkan sub-dokumen. Untuk memfilter ini, Anda perlu menggunakan versi dua argumen Collection.find
.
BasicDBObject query=new BasicDBObject("Notification.url","www.example.com");
BasicDBObject fields=new BasicDBObject("Notification.$", 1);
DBCursor f = con.coll.find(query, fields);
.$
berarti "hanya entri pertama dari larik ini yang dicocokkan dengan operator-penemu"
Ini masih harus mengembalikan satu dokumen dengan sub-array Notifications
, tetapi larik ini hanya boleh berisi entri di mana url == "www.example.com"
.
Untuk menelusuri dokumen ini dengan Java, lakukan ini:
BasicDBList notifications = (BasicDBList) f.next().get("Notification");
BasicDBObject notification = (BasicDBObject) notifications.get(0);
String url = notification.get("url");
Omong-omong: Saat basis data Anda bertambah, kemungkinan besar Anda akan mengalami masalah kinerja, kecuali jika Anda membuat indeks untuk mempercepat kueri ini:
con.coll.ensureIndex(new BasicDBObject("Notification.url", 1));