sql >> データベース >  >> NoSQL >> MongoDB

Javaを使用してMongoDBの配列要素に関するドキュメントをクエリする

    この場合、ネストされたドキュメントがあります。ドキュメントに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));
    



    1. 配列更新演算子$[<identifier>]を使用した次のクエリに相当するMongoDBC#ドライバーは何でしょうか。

    2. 複数のドキュメントを更新し、更新されたすべてのドキュメントを返します

    3. MongoDBはSQLインジェクションの混乱をどのように回避しますか?

    4. ServiceStack:サービスを手動で呼び出すときにパイプラインを復元しますか?