mongodb中存储数组和新数组的区别

mongodb中存储数组和新数组的区别,mongodb,Mongodb,我是mongodb的新手 我在mongodb中存储了以下数据 { "_id" : ObjectId("4"), "uid" : "1", "friendsIds" : [ "2", "3" ] } 案例1: 现在,我有了一套新的FriendsID[“2”、“3”、“4”] 我想比较这两个集合,得到数据库中没有存储的值。在这种情况下,我想得到4 案例2: 现在,我有了一套新的FriendsID[“3”,“4”] 我想比较这两个集合,得到存储在数据库中但不在新集合中的值。在这种情况下,我想

我是mongodb的新手

我在mongodb中存储了以下数据

    { "_id" : ObjectId("4"), "uid" : "1", "friendsIds" : [ "2", "3" ] }
案例1: 现在,我有了一套新的FriendsID
[“2”、“3”、“4”]

我想比较这两个集合,得到数据库中没有存储的值。在这种情况下,我想得到
4

案例2: 现在,我有了一套新的FriendsID
[“3”,“4”]

我想比较这两个集合,得到存储在数据库中但不在新集合中的值。在这种情况下,我想得到
2

案例2是否可以使用mapReduce完成

如何在mongodb中实现这两种情况?

如果您有两个阵列

a = [ "2", "3" ]
b = ["2","3","4"]
在ruby中:

a-b = ["4"]

对于案例1,看起来您需要
[$addToSet][1]
。请看
$each
示例

对于案例2,没有这样的服务器端功能。只需带回文档并在客户端进行比较


您正在执行哪些操作,以便只需要
2
,而不需要其他一切?

这可以在聚合框架中使用其:


我想使用mongodb查询来完成它。在这种情况下,我希望在db中进行此操作比在代码中进行此操作要快得多。开发人员经常犯的最大错误之一是试图将处理工作转移到数据库中—让您的应用程序服务器处理,让您的数据库服务器处理插入和查询。在你的应用程序代码中进行比较。@bryan你为什么说这是“最大的错误”?将处理卸载到db的所有缺点是什么?DB应该针对连接操作进行优化,对吗?[IMO,案例2可以作为连接操作解决]我这么说是因为数据库服务器通常比应用服务器更昂贵,更难扩展。试图强制数据库执行超出必要范围的数据处理听起来可能更容易,但最终意味着数据库服务器可能会开始花费比获取和插入数据更多的时间来处理数据。Facebook在他们的一篇工程博客中特别提到了这一点。另外,MongoDB不做加入。
> db.foo.insert({"friendsIds" : [ "2", "3"]})
WriteResult({ "nInserted" : 1 })

> db.foo.aggregate([ {$project: {diff: {$setDifference: [["2","3","4"], '$friendsIds']}}} ])
{ "_id" : ObjectId("53490a53a0e3abbe0dd0c21c"), "diff" : [ "4" ] }

> db.foo.aggregate([ {$project: {diff: {$setDifference: ['$friendsIds', ["3","4"]]}}} ])
{ "_id" : ObjectId("53490a53a0e3abbe0dd0c21c"), "diff" : [ "2" ] }