2011-09-15 60 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

相關問題