【问题标题】:Sorting with condition in mongodb在mongodb中按条件排序
【发布时间】:2023-04-02 01:02:02
【问题描述】:

这里是示例集合:

[
 {'name': 'element1', ratings: {'user1': 1, 'user2':2}},
 {'name': 'element2', ratings: {'user1': 2, 'user2':1}}
]

我想为 user1 排序: ['element2', 'element1'] , 对于用户 2:['element1', 'element2']。

换句话说,我想将当前用户评分最高的结果放在首位。

集合很大,所以搜索必须使用索引。可以修改集合结构,这只是示例。

【问题讨论】:

  • 聚合框架可以提供帮助,但我不知道如何使用它来完成这项任务。

标签: mongodb


【解决方案1】:

这些是不同领域的排序。第一个是对{ "ratings.user1" : -1 } 的排序,第二个是对{ "ratings.user2" : -1 } 的排序;您将需要每个字段上的索引来支持每种排序。除了少数用户之外,您无法扩展这样的设置。我不知道这些文档的整个用例是什么,但如果核心要求是根据用户的评分对用户的元素进行排序,我会重组集合,以便单个文档代表特定元素的评分由特定用户:

{
    "_id" : ObjectId(...),
    "element" : "element1",
    "user" : "user1",
    "rating" : 1
},
{
    "_id" : ObjectId(...),
    "element" : "element1",
    "user" : "user2",
    "rating" : 2
}

如果您在{ "user" : 1, "rating" : -1 } 上创建索引,则可以对特定用户对元素的评分执行索引查询,按评分降序排列:

db.ratings.find({ "user" : "user1" }).sort({ "rating" : -1 })

【讨论】:

  • “在不同字段上排序” - 这很好,但为每个用户创建索引并不好。如果我能在整个“评级”上创建索引就好了。第二种方法是连接,但 mongodb 没有它们。分页的大结果,我该如何排序?
  • 而第二种方法并不能解决问题。因为我想查找所有结果,不仅针对 user1(还针对 user1 进行排序)。
  • 恐怕我两个都不懂。第二种方式?联接是如何进来的?您是什么意思“查找所有结果,而不仅仅是 user1”?您想查找所有元素并按 user1 的评分排序,即使 user1 没有对元素评分?
  • 是的,这就是我想要的。我在主要收藏中有数百万个文档和数千个用户。加入是因为单独的评级收集。但没有必要,因为我可以使用子文档。 {name: 'element1', ratings: [{user: 'user1', rating: 1}, {user: 'user2', rating:2} ]} 但我如何排序 user1 评分(未找到)?
  • 我还是不明白。我向您展示的文档结构和查询确实按 user1 评级排序。您无法将所有评分都塞入这样的数组中进行您想要的排序 - 您将如何表达排序键?
猜你喜欢
  • 1970-01-01
  • 2021-03-21
  • 1970-01-01
  • 1970-01-01
  • 2013-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-07
相关资源
最近更新 更多