mon go агрегация - количество документов, где поле в одном массиве также находится в другом - PullRequest
1 голос
/ 13 апреля 2020

У меня есть коллекция Movies

...
{
    ...
    "cast":[ "First Actor", "Second Actor" ],
    "directors":[ "First Director", "Second Director" ]
},
{
    ...
    "cast": [ "Actor Director", "First Actor" ],
    "directors": [ "Actor Director", "Firt Director" ]
}
...

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

1 Ответ

1 голос
/ 13 апреля 2020

Вы можете использовать $ setIntersection , чтобы найти общие записи в обоих массивах, а затем фильтровать документы по $ size результата gt чем 0 (означает, что по крайней мере один элемент является общим для массивы) и, наконец, используйте $ count stage для подсчета документов, соответствующих этому условию.

- EDIT: добавьте $ addFields stage в случае отсутствия массива для приведения или директоров

В случае любого документа, который не содержит cast или массив директоров, вы получите ошибку для размера, ожидающего массив и получающего нулевое значение. Чтобы избежать этого, вам нужно добавить этап $ addField для определения пустого массива вместо нуля для приведения и директоров.

Вот запрос:

db.collection.aggregate([
  {
    $addFields: {
      directors: {
        $cond: {
          if: {
            $isArray: "$directors"
          },
          then: "$directors",
          else: []
        }
      },
      cast: {
        $cond: {
          if: {
            $isArray: "$cast"
          },
          then: "$cast",
          else: []
        }
      }
    }
  },
  {
    $match: {
      $expr: {
        $gt: [
          {
            $size: {
              $setIntersection: [
                "$cast",
                "$directors"
              ]
            }
          },
          0
        ]
      }
    }
  },
  {
    $count: "have_common_value"
  }
])

Вы можете проверить это здесь

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