2015-11-20 2 views
1

У меня здесь немного проблем. Поэтому я хочу показать профиль пользователя. Пользователь принадлежит к группам. Зарегистрированный пользователь может видеть детали любых групп, которые у них есть общего. Вот некоторые примеры данныхMongoDB: проекция для соответствия нескольким

{ 
    _id: "1234", 
    battletag: "Fake#1234", 
    guilds: [{ 
    name: "Lok'Narosh!", 
    rank: 4, 
    roles: ['casual'] 
    }, { 
    name: "Warlords of Draenor", 
    rank: 2, 
    roles: ['PvP', 'raider'] 
    }, { 
    name: "Lok'Tar Ogar!", 
    rank: 3, 
    roles: ['raider'] 
    }], 
} 

я могу получить группы текущего пользователя и уменьшить его ['Lok'Narosh!', 'Warlords of Draenor'], а это означает, что Lok'tar Ogar должны быть исключены из результатов.

Основная проблема, с которой я сталкиваюсь, заключается в том, что большинство операций, которые я знаю, возвращают только результат. Например, с $elemMatch:

Оператор $ elemMatch ограничивает содержимое поля из результатов запроса содержит только первый элемент, соответствующий условию $ elemMatch.

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

+0

на стороне клиента или сторона сервера ? Если последнее, то вам, вероятно, понадобится использовать структуру агрегации. –

ответ

0

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

  1. $ размотать оператор деконструкции поля 'гильдии.
  2. Применить критерии поиска с $ match
  3. Восстановить массив.

    db.getCollection ('yourColl'). Aggregate ({$ unwind: "$ guilds"}, {$ match: {"guilds.rank": {$ gte: 2.0}}}, {$ group: { "_id": "$ _ ID", "BattleTag": {$ первый: "$ BattleTag"}, "гильдии": {$ addToSet: "$ гильдии"}}})