查找包含类似嵌套对象的多个MongoDB结果

时间:2011-06-29 14:30:56

标签: 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}});

我在这里可以缺少什么?它引起了一些奇怪的问题,所以我想快速解决这个问题,谢谢!

3 个答案:

答案 0 :(得分:2)

您的查询很好,请在shell中尝试:

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

如果验证后问题仍然存在,请发布两个完整的示例文档和您在mongo日志中出现的查询(setProfilingLevel(2))。

另外,为了完整起见,您可以尝试:

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

哪个完全一样,但稍微“正确”

答案 1 :(得分: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;}}}"});

对于我正在尝试做的事情似乎有点太多了 - 如果有人有更好的解决方案让我知道!

答案 2 :(得分:0)

好像你应该使用$ elemMatch,因为每个用户都有几种类型的帐户。然后它应该正常工作。

http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29

阅读“与$ elemMatch匹配”部分。它的解释比我能做得更好。