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

JavaのfindOneAndUpdateメソッドを使用したMongoDBドキュメント更新配列要素

    arrayFilters 特定の配列要素を(条件付きで)更新します。 Javaの配列フィルターは、FindOneAndUpdateOptionsで定義されます。 オブジェクト。

    List<Bson> arrFilters = new ArrayList<>();
    arrFilters.add(new Document("elem.apn", "abcdef")); // this specifies the element search criteria
    FindOneAndUpdateOptions updateOptions = new FindOneAndUpdateOptions().arrayFilters(arrFilters);
    
    String [] dArray = { "app", "ban", "ora" }; // the "d" array to be added
    Bson update = set("session.ps.$[elem].d", Arrays.asList(dArray));
    
    String idStr = "5e37dc262f5ff4dfc935eb6b";
    Bson queryFilter = eq("_id", new ObjectId(idStr));
    
    Document result = coll.findOneAndUpdate(queryFilter, update, updateOptions);
    System.out.println(result);
    

    Mongo Shellでの同じ更新操作:

    var dArray = [ "app", "ban" ];
    
    db.test.updateOne(
       { _id: ObjectId("5e37dc262f5ff4dfc935eb6b") }, 
       { $set: { "session.ps.$[elem].d" : dArray } },
       {
         arrayFilters: [ { "elem.apn": "abcdef" } ]
       }
    )
    


    [編集追加]

    apnを更新しています 新しい値「newVal」およびと同時に dに新しい文字列要素「gua」を追加する 配列(配列が存在しない場合は新しい配列が追加されます):

    db.test.updateOne(
       { _id: ObjectId("5e37dc262f5ff4dfc935eb6b") }, 
       { 
         $set: { "session.ps.$[elem].apn": "newVal" }
         $push: { "session.ps.$[elem].d" : "gua" } 
       },
       {
         arrayFilters: [ { "elem.apn": "abcdef" } ]
       }
    )
    

    上記のMongoシェルコードのJavaコード:

    List<Bson> arrayFilters = new ArrayList<>();
    arrayFilters.add(new Document("elem.apn", "abcdef"));
    FindOneAndUpdateOptions updateOptions = 
        new FindOneAndUpdateOptions().arrayFilters(arrayFilters);   
    
    Bson pushUpdate = push("session.ps.$[elem].d", "gua");
    Bson setUpdate = set("session.ps.$[elem].apn", "newValue");
    Bson update = combine(pushUpdate, setUpdate);
    
    String idStr = "5e37dc262f5ff4dfc935eb6b";
    Bson queryFilter = eq("_id", new ObjectId(idStr));
    
    Document result = coll.findOneAndUpdate(queryFilter, update, updateOptions);
    



    1. Javaドライバーを介してAtlasM0(無料利用枠)クラスターに正しく接続するにはどうすればよいですか?

    2. 現在と特定の日付の違い

    3. MongoDBにネストされた$addFields

    4. mlabでこのトランザクションエラーを解決する方法は? [MongoError:トランザクション番号は...ドキュメントレベルのロックをサポートしています]