2011-09-15 41 views
9

我有我的文档中的结构如下:如何在MongoDB中更新特定文档在数组中的值?

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

我想更新someFieldsomeField2但只适用于数组中的项目之一,相匹配的一个_arrayId(如_arrayId : ObjectId("dsd87dsa9d87s9d7") ;只有这个文件(如_id : ObjectId("43jh4j343j4j")),并没有其他

arrayIds是不是唯一的,这就是为什么我需要它是特定DOC文档。 ument。如果我想更新数组中存在的每个文档的值,我可以使用$ positional operator,但那不是我想要的。

我正试图在中完成这项工作,但命令行解决方案也可以。

回答

13

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

db.so.update({_id:ObjectId("4e719eb07f1d878c5cf7333c"), 
       "array._arrayId":ObjectId("dsd87dsa9d87s9d7")}, 
       {$set:{"array.$.someField":"updated"}}) 
+0

伟大的作品!谢谢。所以'coll.update(query,data)'中的查询就像一个过滤器,用于查找您正在查找的文档,以及作为您感兴趣的文档部分的选择器? – rjgonzo

+0

是的正确..很高兴它帮助.. – RameshVel

17

这里是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); 
+0

非常感谢你我一直在寻找一个像两个小时的答案...... –

+0

如果我们通过创建someField数组以及更多的级别的数组该怎么办?我们可以写一些像data.put(“数组。$。someField。$。anotherField”,“updated”);不为我工作 – Manish

+0

谢谢,解决了我的问题。数组。$。field是技巧(我使用3.5) – Gilian

相关问题