2011-06-29 47 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

那麼,這正是我在我的例子中測試的情況,所以它應該工作。你使用什麼版本? –