2016-01-11 3 views
0

Я документ структурирован следующим образом:Неожиданный результат при попытке отфильтровать поля в Монго дб

{ 
    _id: "someid", 
    games: [{ 
    slug: "world-of-warcraft", 
    class: 'shaman' 
    }, { 
    slug: 'starcraft-ii', 
    class: 'zerg' 
    }], 
    roles: { 
    'starcraft-ii': ['player'], 
    'world-of-warcraft': ['player'] 
    } 
} 

Я пытаюсь фильтровать так, что только starcraft-ii в массиве игры будет отображаться для всех игроков в роль player в starcraft-ii. Я делаю следующее:

function getUsersInGame(slug) { 
    return Users.find({ 
    'games.slug': slug, 
    [`roles.${slug}`]: 'player' 
    }, { 
    fields: { 
     'games.$': 1, 
     'roles': 1 
    } 
    }); 
} 

Однако это не соответствует в массиве игры, а вместо этого возвращает массив 1-элемент с world-of-warcraft вместо этого.

Каким образом можно фильтровать этот массив в монго?

ответ

1

Используйте $elemMatch в своих полях, так как $ вернет первый элемент массива. Таким образом, ваш запрос должен выглядеть следующим образом:

function getUsersInGame(slug) { 
    return Users.find(
    { 
     '"roles.'+ slug + '"': { $in : ['player']} 
    }, 
    { 
     'games': { 
      $elemMatch: {'slug': slug} 
     }, 
     'roles': 1 
    }); 

Пожалуйста, обратите внимание на разницу от Документов.

«Оператор $ проецирует элементы массива на основе некоторых состояния от оператора запроса

Оператор проецирования $ elemMatch принимает аргумент явного условия. Этот позволяет проектировать на основе условия не в запросе ... »

+0

Документы говорят что и '$ elemMatch', и' $ 'вернут только первый элемент – corvid

+0

Решено ли решение для вас? – Pio

+0

увы, это не так, но я не знаю, почему, потому что документы определенно говорят, что это должно быть – corvid

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