この場合、ネストされたドキュメントがあります。ドキュメントにNotification
フィールドがあります これは、フィールドurl
を持つ複数のサブオブジェクトを格納する配列です。 。サブフィールドで検索するには、ドット構文を使用する必要があります:
BasicDBObject query=new BasicDBObject("Notification.url","www.adf.com");
ただし、これにより、Notification
全体を含むドキュメント全体が返されます。 配列。サブドキュメントのみが必要になる可能性があります。これをフィルタリングするには、2引数バージョンのCollection.find
を使用する必要があります。 。
BasicDBObject query=new BasicDBObject("Notification.url","www.example.com");
BasicDBObject fields=new BasicDBObject("Notification.$", 1);
DBCursor f = con.coll.find(query, fields);
.$
「find-operatorによって一致するこの配列の最初のエントリのみ」を意味します
これでも、サブ配列Notifications
を含む1つのドキュメントが返されます。 、ただし、この配列には、url == "www.example.com"
のエントリのみを含める必要があります。 。
このドキュメントをJavaでトラバースするには、次のようにします。
BasicDBList notifications = (BasicDBList) f.next().get("Notification");
BasicDBObject notification = (BasicDBObject) notifications.get(0);
String url = notification.get("url");
ちなみに: データベースが大きくなると、このクエリを高速化するためのインデックスを作成しない限り、パフォーマンスの問題が発生する可能性があります。
con.coll.ensureIndex(new BasicDBObject("Notification.url", 1));