【问题标题】:Mongo find and rank result [duplicate]Mongo查找和排名结果[重复]
【发布时间】:2015-06-24 13:13:24
【问题描述】:

我有一个 mongo 集合,其中包含类似于以下架构的文档。我有一个用户界面,用户可以从中过滤属性(使用逻辑或)。由于它使用 OR 我希望对结果进行排序,以便我首先获得与最多过滤器匹配的结果。例如:如果我过滤作者“auth1”和“tag1”,我会返回两条记录,但第二条记录在最前面。在这个例子中,我只有 2 个 attr 可供过滤,但大约有 20 个。

您对解决此问题的最佳方法有什么建议吗?我正在考虑编写一个 map-reduce 查询来计算“匹配等级”。

{name: "bookName", tags:["tag1"], authors: [] }
{name: "bookName2", tags:["tag1", "tag2"], authors: ["auth1", "auth2"] }

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    如果我了解您的问题,您希望按 authors.length 和 tags.length 对结果进行排序。

    问题是,在带有sort() 的 MongoDB(我在 2.6 上测试)中,不可能按两个并行数组进行排序。您可以按album.length 或tags.length 排序,但不能同时按两者。

    // sort By max to min authors
    db.getCollection('rank').find({}).sort({ authors : -1 });
    // sort by max to min tags
    db.getCollection('rank').find({}).sort({ tags : -1 });
    

    如果您希望同时对结果进行排序,则应使用聚合框架。你在这里有一个很好的解释:https://stackoverflow.com/a/9040269/1506914

    【讨论】:

    • 我没有尝试对数组的长度进行排序。我需要进行排序,以便当我搜索 tag1 tag2 和 auth1 时,我会取回我的两条记录,但 bookname2 位于顶部,因为它在所有 3 个过滤器上都匹配。 Bookname1 将位于底部,因为它仅匹配 tag1。希望这更有意义
    【解决方案2】:

    可以使用聚合框架。看看this question,和你的差不多。

    【讨论】:

      猜你喜欢
      • 2016-07-12
      • 2018-02-13
      • 1970-01-01
      • 2019-01-05
      • 1970-01-01
      • 1970-01-01
      • 2016-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多