Условный запрос MongoDB к массиву вложенных документов - PullRequest
0 голосов
/ 05 августа 2020

Привет, я пытаюсь написать условный запрос к массиву вложенных документов. Я читал этот документ несколько дней и не мог понять, как заставить его работать. 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, тогда это совершенно нормально.

Мы будем очень признательны за любые предложения или идеи, которые приведут к дальнейшему развитию.

1 Ответ

0 голосов
/ 05 августа 2020

Во-первых, ваш запрос неверен. И не очень очевидно, каковы именно ваши критерии фильтрации. Итак, я даю два предложения:

  1. Если вы хотите отфильтровать все документы, для которых name определено в ваших критериях соответствия (которые возвращают оба документа):

    db.Team.find({"players.name":{$in:[ 'Mario', 'Wario' ]}}).pretty()

  2. Если вы хотите отфильтровать все документы, в которых есть какие-либо указанные имена игроков в массиве замен (который возвращает только один, потому что у team1 нет заменителей, это Mario / Wario)

    db.Team.find({"players.substitutes":{$in:[ 'Mario', 'Wario' ]}}).pretty()

  3. Имена, которые просматриваются, могут присутствовать в name или substitute

    db.Team.find({ $or: [{"players.substitutes":{$in:[ 'Mario', 'Wario' ]}}, {"players.name":{$in:[ 'Mario', 'Wario' ]}}] }).pretty()

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