2013-03-18 63 views
3

我有一個文檔中的mongodatabase只有在與數據庫不同的情況下才更新文檔?

user:{ 
    name:'bruce', 
    surname:'wayne', 
    job:'batman', 
    email:'[email protected]', 
} 

所以當用戶更新信息,我必須:

  1. 查詢到數據庫中,如果用戶存在
  2. 是否存在得到數據庫
  3. 的值
  4. 將數據庫的值與用戶發送的表單值進行比較
  5. 如果來自數據庫的值相等,則放棄操作
  6. 如果從數據庫中的值是diferent,更新值與窗體值
  7. 靠近db和sent.response

所以在這種情況下,如果用戶發送這樣的:

form.newUserInfo:{ 
    name:'bruce albert', 
    surname:'wayne', 
    job:'batman only at night', 
    email:'[email protected]', 
} 

只是更新名稱和工作。

有沒有什麼辦法可以在6個步驟之內做到這一點?我正在使用nodejs v0.10,mongodb 2.2.3,expressjs和mongoskin v0.5

+1

如果新值與舊值相同,替換它們會帶來什麼樣的危害?請更新您的問題,以包含一些關於_why_您嘗試這樣做的信息,這可以幫助他人回答您的問題。 – 2013-03-18 00:19:55

+0

我同意馬丁,你用這六個步驟獲得了什麼?如果兩個人同時編輯記錄,他們仍然會覆蓋彼此的變化。 – robertc 2013-03-18 00:22:13

+0

如果新值與舊值相同,則替換它們是沒有問題的,因爲它們與舊的相同,但它是否有變更只有不同的值另一個問題是當用戶第一次插入值時...我要先檢查是否存在.. – andrescabana86 2013-03-18 00:36:08

回答

1

聽起來好像你正在尋找更新結果的特定字段而不是整個對象本身。即如果用戶只有提供名稱的更新參數,則只需要更新數據庫中的名稱。用你的名字:「布魯斯·艾伯茨」例如,newUserInfo將

newUserInfo: { 
    name: 'bruce albert', 
    surname: '', 
    job: '', 
    email: '' 
} 

,你不想簡單地使用這些值UPSERT,因爲你要麼消滅你已經掌握的信息,或添加重複用較少的信息記錄。

在這種情況下,您目前只能進行優化。

  1. 查詢到數據庫中,如果用戶如果存在的話得到數據庫
  2. 從用戶
  3. 發送,如果從數據庫中值是平等的形式值進行比較的數據庫值的值存在
  4. ,丟棄操作
  5. 如果從數據庫中的值是不同的,更新的值與所述表單值
  6. 靠近db和發送響應

步驟1和步驟2可以結合使用,因爲findOne()(或類似的效果)將返回一個匹配參數的記錄,但前提是該對象存在。如果它不存在,則可能需要插入用戶傳遞的值。

第4步可以刪除,因爲從本質上說,它無論如何什麼都不做。

第5步可能是最重要的,因爲您必須定義值可以如何「不同」。想想,你想用job =''來更新嗎?因爲這與'蝙蝠俠'不同,儘管你可能不想用這個值更新。

我的步驟將是

  1. 查看是否存在於數據庫中的記錄。
    • 如果沒有,插入對象,並轉到步驟3
    • 如果是,轉到步驟2
  2. 在與由用戶所提供的值的數據庫對象進行比較的值。
    • 如果值不同(以您想要的方式),請根據需要更新每個字段。
    • 如果值相同,則沒有什麼可以做,轉到步驟3
  3. 關閉數據庫,併發送響應用戶

希望這有助於。

2

您可能從其他意見/答覆中獲得了所需的信息。但是,這是插入數據的強大方式。

使用$ findAndModify可以控制樂觀併發和upsert。

如果您希望能找到差異,但是如果您可以確定文檔與用戶打開文檔時相同,則可以使用findAndModify自動更新與文檔相同值的文檔當它被加載。

此命令中的更新部分更新所有值,但是如果您願意,可以根據差異輕鬆限制它。

該查詢與修改前的文檔的所有值相匹配。這確保了用戶打開它之後它沒有被更改。

db.people.findAndModify({ 
    query: { 
     name:'bruce', 
     surname:'wayne', 
     job:'batman', 
     email:'[email protected]', 
    },  
    update: { 
     name:'bruce', 
     surname:'wayne', 
     job:'business owner', 
     email:'[email protected]', 
    }, 
    upsert: true 
    // uncomment next line to get the updated/new document return 
    // ,new : true 
}); 
相關問題