2

データベースに次の mongo オブジェクトがあるとします。

{
    "_id" : ObjectId("4f904ebb5bebd4375b759c90"),
    "findme" : "someValue",
    "array" : [
        {
            "id" : "1234"
            "Y" : "0"
        },
        {
            "id" : "3456"
            "Y" : "0"
        },
        {
            "id" : "5678"
            "Z" : "0"
        }
    ]
}

Javaで次のドット表記アクセサーを使用して配列の内容を変更できることを知っています...

BasicDBObject change = new BasicDBObject("findme", "someValue");   
BasicDBObject setDoc = new BasicDBObject();                 
setDoc.append("array.0.Y", "0");                                        
setDoc.append("array.1.Y", "0");                                      
setDoc.append("array.2.Z", "0");                                          
BasicDBObject account = new BasicDBObject("$set", setDoc);
coll.update(change, account);

しかし、ID が「3456」であり、「配列」のインデックス 1 にあることがわかっていない場合、「3456」の「Y」の値を変更するにはどうすればよいでしょうか。これらのクエリオブジェクトと更新メソッドの作成内でこれを完全に達成したいと思います...つまり、オブジェクト全体を引き出して「配列」を反復処理してその位置を見つけたくないのです。

ありがとう!

編集:編集されたコードに示すように、複数の配列要素にフィールド「Y」を含めることができます。特定の要素の「Y」フィールドのみを編集したい。

4

2 に答える 2

4

Java ドライバーを使用してこれを行うには、次の操作を実行できます。

DBObject queryForElem = new BasicDBObject("array", new BasicDBObject("$elemMatch", new BasicDBObject("id", "3456")));
DBObject updateMatchingElem = new BasicDBObject("$set", new BasicDBObject("array.$.Y", "1"));
coll.update(queryForElem, updateMatchingElem);

これは少し扱いに​​くいので、代わりに QueryBuilder を使用すると、読みやすくなります。

DBObject queryForElem = QueryBuilder.start("array").elemMatch(new BasicDBObject("id", "3456")).get();
DBObject updateMatchingElem = new BasicDBObject("$set", new BasicDBObject("array.$.Y", "1"));
coll.update(queryForElem, updateMatchingElem);
于 2013-05-29T13:33:38.850 に答える
0
db.collection.update({array : {$elemMatch : {id : "3456"}}}, {$set : { 'array.$.Y' : '1' }})
于 2013-05-29T00:52:00.877 に答える