2017-01-09 179 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