2012-11-09 45 views
1

比方說,有這樣的一個對象在數據庫:更新幾個對象通過標準

{ 
    _id: <...>, 
    arrayOfObjects: [ 
     { 
      criteria: "one", 
      value: 5 
     }, 
     { 
      criteria: "two", 
      value: 5 
     }, 
     { 
      criteria: "three", 
      value: 5 
     }, 
     { 
      criteria: "four", 
      value: 5 
     }, 

    ] 
} 

我想要做的是運行類似的更新:

{ 
    $inc: { 
     "arrayOfObjects.2.value" : -1 
    } 
} 

然而我需要它隻影響某些元素,例如{$或:[{criteria:「one」},{criteria:「three」}]} 我不能依賴數組索引作爲對象副本我可能在更新執行前已過期(可以插入,刪除對象,在數組中重新排列)。

是否有可能把它關閉?什麼是最佳的方式來做到這一點?

回答

0

使用此查詢

{$or: [{arrayOfObjects.criteria: "one"}, {arrayOfObjects.criteria: "three"}]} 

爲了您更新

編輯:

試試這個

collectionName.update({arrayOfObjects.criteria: "one"}, {$inc: {"arrayOfObjects.$.value" : -1}}, false, true); 

collectionName.update({arrayOfObjects.criteria: "three"}, {$inc: {"arrayOfObjects.$.value" : -1}}, false, true); 

而且,看看這個鏈接瞭解更多信息在MongoDB的更新 http://www.mongodb.org/display/DOCS/Updating#Updating-update%28%29

編輯我的答案。

@JohnnyHK是對的。它需要2個查詢。我的錯。這晚,我累了:)

+0

我很抱歉,我不能讓出來的查詢。你願意寫一個關於這在js客戶端中的樣子的實例嗎? – karka91

+0

對不起,但你的例子不起作用,我看不出它是如何工作的。更新的查詢部分選擇整個文檔,並認爲沒有辦法只選擇文檔的一部分進行更新,就像您在此嘗試的那樣 – karka91

1

你將不得不這樣做,因爲兩個獨立update命令,因爲只有$ positional operator標識相匹配的第一個數組元素:

db.coll.update({_id: <...>, 'arrayOfObjects.criteria': 'one'}, 
    {'arrayOfObjects.$.value': {$inc: -1}}) 
db.coll.update({_id: <...>, 'arrayOfObjects.criteria': 'three'}, 
    {'arrayOfObjects.$.value': {$inc: -1}}) 
0

我不知道到底爲什麼你不能運行Michai的查詢,因爲在我看來這是正確的。所以我張貼我的答案。首先,你不能在一個查詢中做到這一點。是的,聽起來很荒謬,但這裏是這樣的:https://jira.mongodb.org/browse/SERVER-1243

可能這是一個好主意,寫或upvote這個問題,並可能在未來幾個月,他們將解決它。但從2010年後的創建時間來看,我非常懷疑: - (

所以,這裏有一些解決方法如何做到這一點: 首先,如果沒有很多標準,你可以做到這一點使用多個查詢:

db.coll.update({ 
    _id: <...>, 
    'arrayOfObjects.criteria': 'Criteria 1' 
}, { 
    'arrayOfObjects.$.value': { 
    $inc: -1 
    } 
}) 

和你有不同的標準,這樣做多次

但是,如果有太多的標準,它可以浪費了太多的查詢,以便您將能夠在做到這一點。在任何情況下兩個查詢。

  1. 根據您的標準閱讀對象。db.coll.find({'arrayOfObjects.criteria' : { $in: ['one', 'three'] }})
  2. 修改它在你的應用程序級
  3. 將它保存在蒙戈
相關問題