Поиск нескольких результатов MongoDB, содержащих похожие вложенные объекты - PullRequest
2 голосов
/ 29 июня 2011

У меня есть несколько пользователей с несколькими учетными записями в социальных сетях. В какой-то момент некоторые пользователи смогли создать несколько учетных записей в одних и тех же сетях, и я пытаюсь восстановить их все.

У меня есть такая структура:

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

Например, у меня несколько пользователей с одной и той же учетной записью Twitter, и я хочу вернуть их всех. Я использую запрос как

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

и не важно, что я получу только один результат, хотя я на 100% уверен, что больше, чем использование содержит этот идентификатор. Я также попробовал

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

Чего мне здесь не хватает? Это вызывает некоторые странные проблемы, так что я хотел бы быстро все обернуть, спасибо!

Ответы [ 3 ]

2 голосов
/ 29 июня 2011

Ваш запрос в порядке, попробуйте в оболочке:

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}}})

Что делает то же самое, но немного более "правильно"

1 голос
/ 29 июня 2011

Я смог заставить его работать, используя что-то вроде этого:

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 голосов
/ 15 октября 2012

Похоже, вы должны использовать $ elemMatch, потому что у вас есть несколько типов учетных записей для каждого пользователя.Тогда он должен работать правильно.

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

Прочтите раздел «Совпадение с $ elemMatch».Там это объясняется лучше, чем я мог бы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...