Привет, я пытаюсь написать условный запрос к массиву вложенных документов. Я читал этот документ несколько дней и не мог понять, как заставить его работать. DB выглядит следующим образом:
[
{
"id":1,
"team":"team1",
"players":[
{
"name":"Mario",
"substitutes":[
"Luigi",
"Yoshi"
]
},
{
"name":"Wario",
"substitutes":[
]
}
]
},
{
"id":2,
"team":"team2",
"players":[
{
"name":"Bowser",
"substitutes":[
"Toad",
"Mario"
]
},
{
"name":"Wario",
"substitutes":[
]
}
]
}
]
Из-за отсутствия у меня английского sh это сложно поставить, но я пытаюсь найти команды, в которые входят все опрошенные игроки. Каждый объект в массиве игроков, у некоторых есть заменители. Для каждого объекта в массиве игроков, если один из запрошенных игроков не является основным игроком ("player.name"), я хочу, чтобы он проверял, является ли один из заменителей ("player.substitutes").
Team.find({players:{$in:[ 'Mario', 'Wario' ]}}) (mongoose query)
это даст мне массив с 'team1'.
но я хочу получить обе команды, потому что 'Mario' является одним из заменителей 'Bowser' (team2).
Мне не удалось сделать запрос, но я пытался не использовать $ where, поскольку официальные документы MongoDB говорят:
ПРЕДПОЧТИТЕЛЬНЫЕ АЛЬТЕРНАТИВЫ АГРЕГАЦИИ
Начиная с В MongoDB 3.6 оператор $ expr позволяет использовать выражения агрегации в языке запросов. И, начиная с MongoDB 4.4, функция $ и аккумулятор $ позволяют пользователям определять пользовательские выражения агрегирования в JavaScript, если предоставленные операторы конвейера не могут удовлетворить потребности вашего приложения.
Учитывая доступные операторы агрегирования:
Использование $ expr с операторами агрегации, которые не используют JavaScript (то есть операторы, отличные от $ function и не $ аккумулятора), быстрее, чем $ where, потому что оно не выполняет JavaScript и должно быть предпочтительнее, если это возможно. . Однако, если вы должны создавать собственные выражения, $ function предпочтительнее, чем $where
.
НО, если бы это можно было легко написать с помощью оператора $where
, тогда это совершенно нормально.
Мы будем очень признательны за любые предложения или идеи, которые приведут к дальнейшему развитию.