我在一个文档中有 4 个字段,即 name
、online
、like
和 score
。我想通过多个字段和条件对带有分页的数百万个文档的集合进行排序。
一些文档示例:
我的用户文档:
{ "_id": 1, "name": "A", "online": 1, "like": 10, "score": 1 },
{ "_id": 2, "name": "B", "online": 0, "like": 9, "score": 0 },
{ "_id": 3, "name": "C", "online": 0, "like": 8, "score": 1 },
{ "_id": 4, "name": "D", "online": 1, "like": 8, "score": 0 },
{ "_id": 5, "name": "E", "online": 1, "like": 7, "score": 1 },
{ "_id": 6, "name": "F", "online": 0, "like": 10, "score": 0 },
我将通过以下示例(使用数组的示例)来解释我的观点。
ruby 语言示例,我有一个数组结构,如下所示:
[["A", 1, 10, 1],
["B", 0, 9, 1],
["C", 0, 8, 1],
["D", 1, 8, 0],
["E", 1, 7, 1],
["F", 0, 10, 0]]
如果 online
是 1
应该再按 like
降序排序,但是当 online
是 >0
应该按 score
的降序再次排序。
示例排序:
list.sort{|a, b| a[1] == 1 ? ([-a[1], -a[2]] <=> [-b[1], -b[2]]) : ([-a[1], -a[3]] <=> [-b[1], -b[3]]) }
结果如下:
[["A", 1, 10, 1],
["D", 1, 8, 0],
["E", 1, 7, 1],
["B", 0, 9, 1],
["C", 0, 8, 1],
["F", 0, 10, 0]]
那是数组排序,但我的问题是我有mongodb和百万文档的集合,我不能使用数组排序,因为它会很重的数据库负载,应该获取所有文档并转换为数组(包括排序) 而不是对它们进行分页,我认为这是个坏主意。
我尝试了 order()
/order_by()
mongoid 的可选方法,例如:
User.
order_by([:online, :desc], [:like, :desc], [:score, :desc]).
hint(online: -1, like: -1, score: -1).
page(1).per(10)
但该查询仅按 online
和 score
排序,mongoid 中是否有类似数组排序的排序方法?或者 mongodb 中有类似冒泡排序的东西?
同样的问题:Ruby on Rails: Concatenate results of Mongoid criterias and paging , merge
方法对我没有帮助,因为它可以替换第一个条件。
最佳答案
使用聚合$cond
User.collection.aggregate([
{
"$project" => {
"id" => 1,
"name" => 1,
"online" => 1,
"like" => 1,
"score" => 1,
"sort" => {
"$cond" => {
"if" => {
"$eq" => ["$online", 1]
},
"then" => "$like",
"else" => "$score"
}
}
}
},
{
"$sort" => {
"online" => -1,
"sort" => -1,
"id" => 1
}
},
{
"$skip" => 0
{
"$limit" => 12
}
])
引用:
关于ruby-on-rails - 在 Mongoid 中按多个字段和条件排序集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50166805/