14

私のドキュメントには次の構造があります。

{
  _id : ObjectId("43jh4j343j4j"), 
  array : [
            { 
              _arrayId : ObjectId("dsd87dsa9d87s9d7"),
              someField : "something",
              someField2 : "something2"
            },
            { 
              _arrayId : ObjectId("sds9a0d9da0d9sa0"),
              someField : "somethingElse",
              someField2 : "somethingElse2"
            }
   ]
 }

someFieldsomeField2を更新したいのですが、配列内のアイテムの1つ、_ arrayIdに一致するアイテム(例:_arrayId : ObjectId("dsd87dsa9d87s9d7");、このドキュメントのみ(例_id : ObjectId("43jh4j343j4j")))のみを更新します。

arrayIdsはドキュメントに固有ではないため、特定のドキュメント用にする必要があります。$ positional operator配列内のすべてのドキュメントの値を更新したい場合はifを使用できますが、それは私が望んでいることではありません。

私はこれをで達成しようとしていますが、コマンドラインソリューションでも機能します。

4

4 に答える 4

24

に翻訳されたRameshVelのソリューションです:

    DB db = conn.getDB( "yourDB" ); 
    DBCollection coll = db.getCollection( "yourCollection" );

    ObjectId _id = new ObjectId("4e71b07ff391f2b283be2f95");
    ObjectId arrayId = new ObjectId("4e639a918dca838d4575979c");

    BasicDBObject query = new BasicDBObject();
    query.put("_id", _id);
    query.put("array._arrayId", arrayId);

    BasicDBObject data = new BasicDBObject();
    data.put("array.$.someField", "updated");

    BasicDBObject command = new BasicDBObject();
    command.put("$set", data);

    coll.update(query, command);
于 2011-09-15T14:35:15.020 に答える
18

$ positionalこれを達成するためにまだ演算子を使用できます。ただし、_arrayid フィルターと共に親ドキュメントの objectid を指定する必要があります。以下のコマンドラインクエリは正常に動作します

db.so.update({_id:ObjectId("4e719eb07f1d878c5cf7333c"),
              "array._arrayId":ObjectId("dsd87dsa9d87s9d7")},
              {$set:{"array.$.someField":"updated"}})
于 2011-09-15T06:54:40.933 に答える