Bạn có một tài liệu lồng nhau trong trường hợp này. Tài liệu của bạn có một trường Notification
là một mảng lưu trữ nhiều đối tượng con với trường url
. Để tìm kiếm trong một trường phụ, bạn cần sử dụng cú pháp dấu chấm:
BasicDBObject query=new BasicDBObject("Notification.url","www.adf.com");
Tuy nhiên, điều này sẽ trả về toàn bộ tài liệu với toàn bộ Notification
mảng. Bạn có thể chỉ muốn tài liệu phụ. Để lọc điều này, bạn cần sử dụng phiên bản hai đối số của Collection.find
.
BasicDBObject query=new BasicDBObject("Notification.url","www.example.com");
BasicDBObject fields=new BasicDBObject("Notification.$", 1);
DBCursor f = con.coll.find(query, fields);
.$
có nghĩa là "chỉ mục nhập đầu tiên của mảng này được so khớp bởi toán tử tìm"
Thao tác này vẫn sẽ trả về một tài liệu có mảng con Notification
, nhưng mảng này chỉ nên chứa mục nhập url == "www.example.com"
.
Để duyệt qua tài liệu này bằng Java, hãy làm như sau:
BasicDBList notifications = (BasicDBList) f.next().get("Notification");
BasicDBObject notification = (BasicDBObject) notifications.get(0);
String url = notification.get("url");
Nhân tiện: Khi cơ sở dữ liệu của bạn phát triển, bạn có thể sẽ gặp phải các vấn đề về hiệu suất, trừ khi bạn tạo chỉ mục để tăng tốc truy vấn này:
con.coll.ensureIndex(new BasicDBObject("Notification.url", 1));