如何在MongoDB中更新特定文档的特定嵌入文档的值?

rjg*_*nzo 10 java mongodb mongodb-java

我的文档中有以下结构:

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

我想更新someFieldsomeField2但仅针对数组中的一个项目,匹配_arrayId的项目(例如_arrayId : ObjectId("dsd87dsa9d87s9d7");仅用于此文档(例如_id : ObjectId("43jh4j343j4j"))而不是其他项目).

arrayIds是不是唯一的,这就是为什么我需要它是针对特定文档的文档.我可以使用$ positional operatorif if我想在数组中为它存在的每个文件更新该值,但这不是我想要的.

我试图在实现这一点,但命令行解决方案也可以.

rjg*_*nzo 21

这是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);
Run Code Online (Sandbox Code Playgroud)


Ram*_*Vel 15

您仍然可以使用$ positional运算符来完成此操作.但是您需要指定父文档的objectid以及_arrayid过滤器.以下命令行查询工作正常

db.so.update({_id:ObjectId("4e719eb07f1d878c5cf7333c"),
              "array._arrayId":ObjectId("dsd87dsa9d87s9d7")},
              {$set:{"array.$.someField":"updated"}})
Run Code Online (Sandbox Code Playgroud)