Mongodb 聚合以对数组中最常见的项目进行排序?

HAR*_*118 2 javascript mongoose mongodb mongodb-query aggregation-framework

集合中的项目包含一个字符串数组。我想查找数组中最匹配元素的项目并对其进行排序。

考虑一个集合:

[
    {
        "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"]
    }

]
Run Code Online (Sandbox Code Playgroud)

我想基于像 ["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"]
    }

]
Run Code Online (Sandbox Code Playgroud)

预期的顺序将是 Item_2、Item_1,然后是 Item_3,因为,

  • Item_2 匹配 3 个项目(“B”、“D”和“G”)
  • 然后 Item_1 有 2 个匹配项(“B”和“D”)
  • 最后 Item_3 有 1 场比赛(“B”)

如果不在 mongodb 中,JavaScript 方法也将受到赞赏

tha*_*.ts 5

如果 中的值是唯一的,则可以使用和 来使用 和 查询数组tags的交集大小tags$size$setIntersection

db.collection.aggregate([
  {
    $set: {
      matchedCount: {
        $size: {
          $setIntersection: ["$tags", ["B","D","G","F"]]
        }
      }
    }
  },
  {
    $sort: {
      matchedCount: -1
    }
  }
])
Run Code Online (Sandbox Code Playgroud)