2011-05-06 89 views
0

我是mongodb的新手。mongodb中存储数组和新数组之间的区别

我已存储在MongoDB中

{ "_id" : ObjectId("4"), "uid" : "1", "friendsIds" : [ "2", "3" ] } 

案例1以下数据: 现在,我有了新的一套friendsIds ["2","3","4"]

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

案例2: 现在,我有了新的一套friendsIds ["3","4"]

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

案例2可以使用mapReduce?

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

回答

0

,如果你有两个数组

a = [ "2", "3" ] 
b = ["2","3","4"] 

在红宝石:

a-b = ["4"] 
+0

我想用MongoDB的查询做到这一点。在这种情况下,我希望在db中执行它的速度应该比在代码中快得多。 – venkat 2011-05-06 00:51:03

+0

开发人员经常犯的最大错误之一是试图将处理卸载到数据库 - 让应用程序服务器处理它并让数据库服务器处理插入和查询。在您的应用程序代码中进行比较。 – 2011-05-06 01:35:09

+0

@bryan为什么你说它是“最大的错误”?卸载处理db的所有缺点是什么? DB应该为连接操作进行优化吗? [IMO,案例2可以作为连接操作解决] – venkat 2011-05-06 02:19:58

1

为1的情况下,它看起来像你需要[$addToSet][1]。看看$each的例子。

对于情况2,没有这样的服务器端功能。只需带回文档并比较客户端。

你在做什么行动,你只是想要2而不是其他所有的东西?

0

这可以在聚合框架使用来实现其set operators

> 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" ] } 
相关问题