2017-01-09 113 views
1

努力讓我的頭腦圓滿 - 嘗試了各種方法,但忍不住覺得我太過於複雜。用貓鼬更新陣列

我有一組存儲在我的MongoDB的數據庫作爲數組的值,例如:

{ 
    _id: 1234, 
    users: ['Bob', 'James', 'Catherine', 'Emma'] 
} 

一個新數組然後從我的應用程序發送到服務器,例如

var newArray = ['Edward', 'Bob', 'David', 'James', 'Ellie', 'Monica'] 

我想要做的就是更新數組,因此:

  1. 目前被刪除
  2. 兩個陣列中的所有元素都的所有元素在數據庫中,但不是新的數組中保留
  3. 任何元件的新陣列中但不存在於原始酮加入

所以最終的resul牛逼保存到數據庫應該是:

['Bob', 'James', 'Edward', 'David', 'Ellie', 'Monica'] 

我已經試過只運行

documents.findOneAndUpdate({ id: 1234 }, { 
    $set: { users: newArray } 
}) 

,但它是所有新的陣列添加到現有的一個,所以我結束了重複和它不刪除不需要的值 - 導致以下:

{ 
    _id: 1234, 
    users: ['Bob', 'Bob', 'James', 'James', 'Catherine', 'Emma', 'David', 'Edward', 'Ellie', 'Monica'] 
} 

我也試過:

newArray.forEach(function(user){ 
    documents.findOneAndUpdate({ id: 1234 }, { 
     $addToSet: { users: user } 
    }) 
}) 

它增加了新的價值,而無需複製現有的,但不刪除不屬於新提交陣列中的,即:

{ 
    _id: 1234, 
    users: ['Bob', 'James', 'Catherine', 'Emma', 'Edward', 'David', 'Ellie', 'Monica'] 
} 

有一個簡單的辦法做到這一點沒有一系列複雜的嵌套循環和對數據庫的多次調用(這是我目前看起來正在發生的事情)?

爲簡潔起見,我沒有在上面的代碼中包含回調函數或.exec函數 - 我知道這些函數是必須執行的,但是如果將它們包含在內,它會變得有點複雜。

編輯:我還應該補充說,這是我實際工作的簡化版本,但應該證明我試圖實現的目標。

謝謝!

+0

我的建議是使用[Lodas](https://lodash.com/docs/4.17.4#union) – IARKI

回答

0

沒有嘗試這樣的:

documents.findOne({ id: 1234 },function(doc) { 
    doc.users = newArray 
    doc.save() 
}) 

我以前做過這樣的,但從來沒有與findOneAndUpdate嘗試。

+0

完美!我知道我讓事情太複雜了!有時似乎有很多不同的方式可以用mongoDB/mongoose做同樣的事情,很容易錯過簡單的東西。無論如何,感謝一百萬! – Chris

+0

很高興幫忙,快樂編碼! – damianfabian