MongoDB如何按多个字段排序?

3

enter image description here

抱歉我的英语不太好。 我想按照这种方式进行排序:'initial' 状态首先排序,然后按照 'create_time' 进行排序。这是可能的吗?我猜测 'aggregate' 可能有帮助,但我不知道它如何在这种情况下使用。


1
MongoDB在文档中解释了如何实现这一点:https://docs.mongodb.com/manual/reference/method/cursor.sort/#cursor.sort - Ian Mercer
状态的顺序是什么? - Saravana
1
请提供一个示例文档以及一个已排序的示例结果。 - kevinadi
@KevinAdistambha 对不起,我是stackoverflow的新手。上面有一个链接显示了我的示例。我想先获取“initial”状态,然后按“create_time”字段排序。 - Randy
@Saravana 我想先获取“初始”状态的文档,然后按照“create_time”字段排序其他文档。 - Randy
3个回答

4
您可以在3.4中尝试以下聚合以进行自定义排序。
使用$indexOfArray定位“initial”的位置,当找到状态时为0,否则为-1(其他所有文档)并使用$addFields将输出索引保留在文档中的额外字段中,随后使用$sort对字段进行排序。
使用$project排除排序字段以获取预期的输出。
当您对所有初始状态文档进行排序时,它们将显示在顶部,然后是按create_time排序。
    db.col.aggregate([
        {
            "$addFields":{ 
                "statusValue":{
                    "$indexOfArray":[
                        ["initial"], "$status"
                    ]
                }
            }
        }, 
        {
            "$sort":{
                "statusValue":-1, "create_time":-1
            }
        },
        {
            "$project":{
                "statusValue":0
            }
        }
    ])

2

补充Veeram的答案,您可以使用标准的MongoDB sort()方法(如Ian Mercer的评论所述),以及聚合功能。例如:

> db.test.find()
{
  "_id": ObjectId("5a6eb96a2937803b14255182"),
  "status": "enabled",
  "create_time": "2018-01-16"
}
{
  "_id": ObjectId("5a6eb9722937803b14255183"),
  "status": "enabled",
  "create_time": "2018-01-10"
}
{
  "_id": ObjectId("5a6eb97b2937803b14255184"),
  "status": "disabled",
  "create_time": "2018-01-15"
}
{
  "_id": ObjectId("5a6eb9892937803b14255185"),
  "status": "initial",
  "create_time": "2018-01-08"
}

按照状态,然后按照创建时间排序:

> db.test.find().sort({status:1, create_time:1})
{
  "_id": ObjectId("5a6eb97b2937803b14255184"),
  "status": "disabled",
  "create_time": "2018-01-15"
}
{
  "_id": ObjectId("5a6eb9722937803b14255183"),
  "status": "enabled",
  "create_time": "2018-01-10"
}
{
  "_id": ObjectId("5a6eb96a2937803b14255182"),
  "status": "enabled",
  "create_time": "2018-01-16"
}
{
  "_id": ObjectId("5a6eb9892937803b14255185"),
  "status": "initial",
  "create_time": "2018-01-08"
}

请注意,上面示例的排序顺序使用了字符串排序,因此在按字母顺序排序时,disabled将排在enabled之前。同样,create_time排序顺序也是基于字符串比较排序。
如果要更丰富地排序create_time,则需要将该字段转换为ISODate()对象。请参阅Date()mongo shell中的数据类型
使用这种方式进行游标排序的一个优点是索引使用。经过适当索引,查询可以快速完成,无需在内存中进行排序,因为MongoDB使用索引执行排序。请参阅创建索引以支持您的查询使用索引对查询结果进行排序
如果其中任何概念对您来说都是新的,请建议您浏览MongoDB University免费学习有关MongoDB的课程。

谢谢Kevin,我认为MongoDB很容易上手但难以精通,前方还有很长的路要走,哈哈。我会在你上面提到的内容中学到更多的知识,谢谢! - Randy

2
聚合可以用于高级自定义排序,但在这种情况下,您可以使用Sort()方法。因此,让我简要介绍一下Mongo中的sort方法。
"sort()方法用于对MongoDB中的文档进行排序。该方法接受一个包含字段列表及其排序顺序的文档。为了指定排序顺序,使用1和-1。1用于升序排列,而-1用于降序排列。"
所以,在您的情况下,请使用sort()方法:
按状态排序,然后按创建时间排序:
db.test.find().sort({status:-1, create_time:1})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接