2013-05-29 166 views
2

說我有一個數據庫中的以下蒙戈對象:訪問元素

{ 
    "_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

爲此使用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); 
+0

非常感謝您的回答,它確實適用於我提供的示例,但是我意識到我的示例沒有完全說明我的isse。請參閱編輯的問題。 – exxodus7

+0

我用更新後的示例運行了我的代碼,它仍然有效。請注意,「新的BasicDBObject(」$ elemMatch「,新的BasicDBObject(」id「,」3456「))」是查找數組中匹配所需ID的條目的位。 – Trisha

+0

糟糕,我也很適合我!謝謝! – exxodus7

0
db.collection.update({array : {$elemMatch : {id : "3456"}}}, {$set : { 'array.$.Y' : '1' }})