【问题标题】:Sort mongodb query on multiple fields对多个字段的 mongodb 查询进行排序
【发布时间】:2019-03-30 08:49:16
【问题描述】:

我想对搜索博主的 mongodb 查询进行排序。

这里是 Blogger 的文档结构(简化):

{
  posts : {
    hashtags : [{
      hashtag : String,
      weight  : Number
    }]
  },
  globalMark : Number
}

人们可以通过输入文本搜索博主。例如:他们可以写“时尚旅行”并点击搜索按钮。

我希望显示帖子包含匹配 /fashion/i 和 /travel/i 的主题标签的博主,并按相关性排序。相关性取决于 globalMark 和 hashtag 权重。

我知道如何让他们跳过主题标签权重,但不知道如何在我的查询中包含此权重....

这是我当前的查询:

Blogger.find({
  "$and" : [{
    "posts.hashtags.hashtag" : {$regex: /fashion/i}
  }, {
    "posts.hashtags.hashtag" : {$regex: /travel/i}
  }]
})
.sort("-globalMark")

我该如何处理这个重量? 非常感谢!

【问题讨论】:

    标签: mongodb nosql mongodb-query


    【解决方案1】:

    我已经使用 mongodb 聚合和 $project 管道阶段实现了它。基本上 $project 可以让你修改结果文档,所以我用它来建立一个关于不同字段的分数,然后根据这个建立的分数对聚合进行排序。

    这里是文档: https://docs.mongodb.com/manual/reference/operator/aggregation/project/

    【讨论】:

      【解决方案2】:

      首先想一想:MongoDB 不是带有 like 运算符的 for 搜索(如果您的数据很大,您会有一些延迟)。 第二个想法:主题标签值需要是对象或数组中的对象 第三:可以使用

      db.collectionName.find({
          $and: [
              {"posts.hashtags.hashtag" : {$regex: /fashion/i}},
              {"posts.hashtags.hashtag" : {$regex: /travel/i}}
          ]
      }).sort({
          globalMark: 1, "posts.hashtags.weight": 1
      })
      

      【讨论】:

      • 嘿!谢谢 !!!不幸的是,它不起作用...如果一个 Blogger 的帖子带有标签“时尚”且重量 = 10,但另一个 Blogger 的帖子带有标签“时尚”且重量 = 4,但其他随机标签的重量超过 10,那么这个Blogger 将在第一个之前显示。 :(
      • 在 mongo 中排序,两个字段的工作方式如下:首先使用 globalMark 排序,然后是 posts.hashtags.weight。如果您想要对posts.hashtags.weight 进行DESC 排序,请使用"posts.hashtags.weight": -1。如果我还能做任何其他事情,请告诉我
      • 谢谢,但我的意思是我只想对与我的 $regex 匹配的主题标签权重进行排序:类似于 {keySort: {"posts.hashtags.weight": 1}, condition: {"posts. hashtags.hashtag": {$regex: /fashion/i}}}
      • 我发现最好先查看我的文档并将所有主题标签附加到单个字符串中,然后使用带有分数排序的 MongoDB 文本搜索功能...
      • 如果您愿意分享您的收藏完成结构,我会尽力帮助您:)
      猜你喜欢
      • 1970-01-01
      • 2020-10-22
      • 2017-06-03
      • 2018-08-19
      • 1970-01-01
      • 2020-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多