2011-06-29 74 views
2

我有一些用户连接了多个社交网络帐户。某些用户可以使用这些相同的网络创建多个帐户,并试图让他们全部融入。查找包含类似嵌套对象的多个MongoDB结果

我有一个结构有点像这样:

users: [ 
    { 
    accounts: [ 
     { 
     type: "twitter", uid: 123123 
     }, 
     { 
     type: "facebook", uid: 123123 
     } 
    ] 
    } 
] 

我有多个用户与同一个Twitter账户的实例,我要回他们。我使用查询像

db.users.find({"accounts.type": "twitter", "accounts.uid" : 123123}); 

而且不管是什么,虽然我100%肯定比使用更包含这个ID,我只拿回一个结果。我也试过

db.users.find({"accounts: {"type": "twitter", "uid": 123123}}); 

我在这里可能会错过什么?这导致了一些奇怪的问题,所以我想快速把它包起来,谢谢!

+0

嗯,我相信它只是回报* *只有*的结果帐户,而不是多个结果。 – Lowgain

+0

用户是嵌入式收藏还是它的根? –

+0

用户是根集合 – Lowgain

回答

1

我能得到它的工作使用的东西是这样的:

db.users.find({"$where": "function(){for(var i in this.accounts){if(this.accounts[i].type='twitter'&&this.accounts[i].uid==123123){return true;}}}"}); 

似乎有点像太多,我尝试做虽然 - 如果任何人有一个更好的解决方案,让我知道!

+0

这不是用于此用例。除此之外,查询比本地对手慢得多。 –

+0

我意识到速度的影响,但在这一点上,这是所有一直在工作 – Lowgain

2

您的查询就好了,尝试在外壳:

db.users.save({accounts: [{type: "twitter", uid: 12345},{type: "facebook", uid: 67890}]}) 
db.users.save({accounts: [{type: "twitter", uid: 12345},{type: "facebook", uid: 67890}]}) 
db.users.count({'accounts.type':"twitter", 'accounts.uid':12345}) 
2 

后两个完整的样本文件和您的查询,它们出现在蒙戈日志(setProfilingLevel(2)),如果你的问题核实后仍然存在。

而且,只是为了完整起见,你可以尝试:

db.users.count({accounts:{$elemMatch:{type: "twitter", uid: 12345}}}) 

这不完全一样,但略微更“正确”

+0

我做到了这一点,但我只会得到一个结果,如果它只包含* twitter uid 12345,如果它也有Facebook的acct它不会工作。这可能与我的mongo版本有关吗? – Lowgain

+0

那么,这正是我在我的例子中测试的情况,所以它应该工作。你使用什么版本? –