2014-12-27 2 views
1

Я не думаю, что это конкретный вопрос Метеор, а скорее вокруг монго и построения запросов манго.Как вы можете запросить коллекцию через вложенные массивы в mongodb (Meteor)?

Если у меня есть следующая структура,

{ 
    username : someName, 
    contacts : [ 
    { 
     userid : asdfae33rtqqxxx, 
     name : contactName, 
     status : friend 
    } 
    { 
     userid : asdfae33rtqqxxx, 
     name : anotherName, 
     status : pending 
    } 
    { 
     userid : asdfae33rtqqxxx, 
     name : contactName, 
     status : blocked 
    } 
    ] 
} 

Как я мог пройти в значениях из этого массива в запрос против сбора пользователей, к) получить пользователь в этом массиве, или б) получить все пользователей в этом массиве из коллекции пользователей с определенным статусом.

Если это невозможно, как мне настроить мою схему, чтобы сделать подобные запросы возможными?

+0

Я думаю, что вы должны сделать другую коллекцию с именами контактов с именем пользователя как ключ отношения – Sindis

+0

Я не думаю, что это правильное решение для моего варианта использования, также адрес электронной почты является единственным естественным первичным ключом, который я использую, но в то время как Meteor кажется чтобы хорошо работать с некоторой нормализацией (сохранение публикаций/подписки меньше), я бы предпочел не полностью нормализовать мои данные. – pushplaybang

+0

В связанном вопросе, как я могу найти элемент массива контактов, если я ищу 'status: pending'? – a4xrbj1

ответ

1

Эта функция возвращает Meteor.users курсор на основе массива контактов и необязательно необходимый статус:

var usersByContacts = function(contacts, requiredStatus) { 
    var userIds = _.chain(contacts) 
    .map(function(c) { 
     if (requiredStatus) { 
     if (c.status === requiredStatus) 
      return c.userid; 
     } else { 
     return c.userid; 
     } 
    }) 
    .compact() 
    .value(); 

    return Meteor.users.find({_id: {$in: userIds}}); 
}; 

Вы можете использовать его как это:

var users1 = usersByContacts(thing.contacts); 
var users2 = usersByContacts(thing.contacts, 'pending'); 

Это предполагает thing имеет схему ссылка на ваш вопрос. Также обратите внимание, что если вы обнаружите, что это общий шаблон в вашем коде, вы должны рассмотреть возможность превращения usersByContacts в transform.

+0

Отличный совет dave, спасибо, я изначально действительно пытался выяснить, есть ли собственный способ использовать эти значения в самом запросе mongo, но это отличное решение и довольно прямолинейно. веселит. Я собираюсь оставить вопрос открытым на день или около того, но я собираюсь продолжить и использовать это, и, безусловно, посмотрю на преобразования. – pushplaybang

+0

Отлично - я рад, что это было полезно. У Mongo нет понятия о соединениях, поэтому я уверен, что это единственный способ сделать это. –

Смежные вопросы