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

标签 javascript mongodb mongoose 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"]
    }

]

我想根据 ["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”)
  • 然后是具有 2 个匹配项(“B”和“D”)的 Item_1
  • 最后 Item_3 有 1 个匹配(“B”)

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

最佳答案

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

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

关于javascript - Mongodb 聚合以对数组中最常见的项目进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62877287/

相关文章:

node.js - 来自 NodeJS 或 mongoose 的 mongodump/mongorestore

javascript - 如何有条件地从 MongoDB 中的对象数组中删除一个字段?

javascript - 在 each() 的 div 中访问输入的值

javascript - 如果 jQuery 认为它正在接收 JSONP 请求,我该如何解释 JSON?

javascript - 将 javascript 变量添加到 addDomListener

Mongodb 在特定的 db 命令上使用 db.help()

JavaScript 复选框 cookie

mongodb - 启动 mongod fork,ERROR : child process failed, exited with error number 1

ruby-on-rails - 通过 _type 字段实例化 mongoid 子类

javascript - 与nodejs、mongoose 和 JSON 对象数组拼接