11

私はMongoDBが初めてです。私のサンプルドキュメントは

{
    "Notification" : [
        {
            "date_from" : ISODate("2013-07-08T18:30:00Z"),
            "date_too" : ISODate("2013-07-30T18:30:00Z"),
            "description" : "fdfd",
            "url" : "www.adf.com"
        },
        {
            "date_from" : ISODate("2013-07-01T18:30:00Z"),
            "date_too" : ISODate("2013-07-30T18:30:00Z"),
            "description" : "ddddddddddd",
            "url" : "www.pqr.com"
        }
    ],

通知を更新しようとしてい"url" : "www.adf.com"ます。これを行うための私のJavaコードは次のとおりです。

BasicDBObject query=new BasicDBObject("url","www.adf.com");

DBCursor f = con.coll.find(query);

"url"が であるドキュメントは検索しません"www.adf.com"

4

1 に答える 1

14

この場合、ネストされたドキュメントがあります。ドキュメントには、フィールドNotificationを持つ複数のサブオブジェクトを格納する配列であるフィールドがありますurl。サブフィールドを検索するには、ドット構文を使用する必要があります。

BasicDBObject query=new BasicDBObject("Notification.url","www.adf.com");

ただし、これはドキュメント全体とNotification配列全体を返します。おそらくサブドキュメントのみが必要です。これをフィルタリングするには、 Collection.find の 2 つの引数バージョンを使用する必要があります。

BasicDBObject query=new BasicDBObject("Notification.url","www.example.com");
BasicDBObject fields=new BasicDBObject("Notification.$", 1);

DBCursor f = con.coll.find(query, fields);

これ.$は、「検索演算子によって一致するこの配列の最初のエントリのみ」を意味します

これでもサブ配列 を持つ 1 つのドキュメントが返されるNotificationsはずですが、この配列にはエントリ where のみが含まれている必要があり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));
于 2013-07-26T10:43:47.627 に答える