Как получить пересечение двух массивов в MongoDB ($ setIntersection не работает хорошо)

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

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

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

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

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

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

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

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

Есть ли лучший способ сделать это?

Всего 1 ответ


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

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

MongoPlayground


Есть идеи?

10000