Как получить пересечение двух массивов в MongoDB ($ setIntersection не работает хорошо) - PullRequest
2 голосов
/ 16 января 2020

У меня есть простая структура данных, которая определяет людей и их друзей.

{
  id: 0,
  name: 'a',
  friends: [1,2,3]
}

Мне нужно найти общих друзей двух людей. Мне удалось с помощью агрегационной пиплелины получить массив friends в массив.

{ "_id" : 0, "friends" : [ [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 ], [ 0, 1, 2 ] ] }

Таким образом, поле friends является вложенным массивом, и я хочу получить пересечение его элементов.

Я пытался использовать операцию $setIntersection, однако я обнаружил, что она не принимает переменную массива, она принимает только массив переменных. Поэтому я должен использовать что-то вроде этого, чтобы получить результат.

{
  $project: {
    commonFriendIds: {
      $setIntersection: [
        { $arrayElemAt: ["$friends", 0] },
        { $arrayElemAt: ["$friends", 1] }
      ]
    }
  }
}

Это выглядит ужасно, и я должен изменить код, если мне нужно найти общих друзей из 3 или более человек.

Есть ли лучший способ выполнить sh это?

1 Ответ

2 голосов
/ 16 января 2020

Вы можете использовать $reduce оператор агрегирования. Теперь он предоставит вам пересечение для всех вложенных массивов в массиве friends.

db.collection.aggregate([
  { "$project": {
    "commonFriendIds": {
      "$reduce": {
        "input": "$friends",
        "initialValue": { "$arrayElemAt": ["$friends", 0] },
        "in": { "$setIntersection": ["$$this", "$$value"] }
      }
    }
  }}
])

MongoPlayground

...