[mongodb]使用mongodb中數組元素的下標來做更新(update)多維數組

mongodb的DBObject支持保存多維數組,在增加元素時使用"$push"操作符,在刪除元素時使用"$pull".

但是在做更新時問題就來了,mongodb首先支持使用"$"來定位數組中的某個元素,例如:

> t.find()
{ "_id" : ObjectId("4b97e62bf1d8c7152c9ccb74"), "title" : "ABC",
"comments" : [ { "by" : "joe", "votes" : 3 }, { "by" : "jane", "votes" : 7 } ] }
> t.update( {'comments.by':'joe'}, {$inc:{'comments.$.votes':1}}, false, true )
> t.find()
{ "_id" : ObjectId("4b97e62bf1d8c7152c9ccb74"), "title" : "ABC",
"comments" : [ { "by" : "joe", "votes" : 4 }, { "by" : "jane", "votes" : 7 } ] }

但是"$"操作符僅支持一維數組的定位,在更新多維數組時會返回錯誤信息,例如有如下數據結構:
{
"_id":ObjectId("4b97e62bf1d8c7152c9ccb74"),
”comments“:[
  {
  "by":"joe",
  "votes":3,
  "replies":[
              {"by":"jane",
              "votes":2
             }]
   }]
}
如果要將"replies"中{“by”:"jane"}的投票數增加1,該如何做呢(使用"$"mongodb會返回錯誤)?

mongodb使用多維數組下標的方式來定位某個元素,那麼我們的方法就有了:

先find({"comments.replies.by":"jane"})來獲取到整個object,然後計算相應reply的數組下標,再使用update({"comments.0.replies.0.by":"jane"},{"$inc",{"comments.0.replies.0.votes":1}}),即可,這樣就沒有同步的問題了。


ps:其實比較好的方法是由用戶客戶端程序來提供這個下標,即mongodb客戶端不要到服務器獲取這個多維數組再計算下標,效率太慢了。如果這個多維數組已經呈現給用戶的話,那麼完全可以由用戶端的程序來提供這個下標,這樣效率是很高的。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章