Агрегат Mongodb для сортировки элементов с наиболее распространенными элементами в массиве? - PullRequest
1 голос
/ 13 июля 2020

Элемент в коллекции содержит массив строк. Я хотел бы найти и отсортировать элементы с большинством совпадающих элементов в массиве.

Рассмотрим коллекцию:

[
    {
        "item_name":"Item_1",
        "tags":["A","B","C","D","E"]
    },
    {
        "item_name":"Item_2",
        "tags":["A","B","D","E","G"]
    },
    {
        "item_name":"Item_3",
        "tags":["B","C","E","H"]
    }

]

Я хочу отсортировать коллекцию на основе такого массива, как ["B", «D», «G», «F»], который вернет

[

    {
        "item_name":"Item_2",
        "tags":["A","B","D","E","G"]
    },
    {
        "item_name":"Item_1",
        "tags":["A","B","C","D","E"]
    },
    {
        "item_name":"Item_3",
        "tags":["B","C","E","H"]
    }

]

Ожидаемый порядок будет Item_2, Item_1, а затем Item_3, поскольку,

  • Item_2 соответствует 3 элементам («B», «D» и «G»)
  • затем Item_1 с 2 совпадениями («B» и «D»)
  • наконец Item_3 с 1 совпадением («B»)

Если не в mongodb, методы JavaScript также будут оценены

Ответы [ 2 ]

3 голосов
/ 13 июля 2020

Если значения в tags уникальны, вы можете использовать размер пересечения tags и массива запроса, используя $size и $setIntersection

db.collection.aggregate([
  {
    $set: {
      matchedCount: {
        $size: {
          $setIntersection: ["$tags", ["B","D","G","F"]]
        }
      }
    }
  },
  {
    $sort: {
      matchedCount: -1
    }
  }
])
1 голос
/ 13 июля 2020

Вы можете использовать $setIntersection, чтобы получить количество пересекающихся элементов, а затем $sort на основе вычисленной оценки.

db.collection.aggregate([
  {
    $project: {
      _id: 0,
      item_name: "$item_name",
      tags: "$tags",
      score: {
        $let: {
          vars: {
            intersection: {
              $setIntersection: [
                "$tags",
                [
                  "B",
                  "D",
                  "G",
                  "F"
                ]
              ]
            }
          },
          in: {
            $size: "$$intersection"
          }
        }
      }
    }
  },
  {
    $sort: {
      score: -1
    }
  }
])

https://mongoplayground.net/p/tpDTtVKetFT

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