MongoDB如何按这样的多个字段排序?

时间:2018-01-29 02:58:27

标签: database mongodb

enter image description here

抱歉我的英文。 我希望按此排序,'initial'状态排序优先,然后按'create_time'排序。这可能吗?我想'aggregate'可能会有所帮助,但我不知道如何在这种情况下使用它。

3 个答案:

答案 0 :(得分:1)

为了补充Veeram的答案,您可以使用标准的MongoDB > 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" } 方法(根据Ian Mercer的评论)以及聚合。例如:

status

create_time排序,然后按> 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()的更丰富选项,您需要将字段转换为System.DefaultWorkingDirectory对象。请参阅Date()Data Types in the mongo Shell

使用这样的游标排序的一个优点是索引使用。正确索引后,查询可以快速而无需在内存中进行排序,因为MongoDB使用索引来执行排序。请参阅Create Indexes to Support Your QueriesUse Indexes to Sort Query Results

如果这些概念对你来说是新的,我建议你仔细阅读MongoDB University关于MongoDB的免费课程。

答案 1 :(得分:0)

您可以在3.4中尝试以下聚合进行自定义排序。

使用$indexOfArray找到" initial"的位置,找到状态时为0,对于所有其他文档,使用其他值为-1,$addFields将输出索引保留在文档中的额外字段后跟$sort字段排序。

$project,但要排除排序字段以获得预期的输出。

排序时,所有初始状态文档显示在顶部,然后按create_time排序。

db.col.aggregate([
 {"$addFields":{ "statusValue":{"$indexOfArray":[["inital"], "$status"]}}}, 
 {"$sort":{"statusValue":-1, "create_time":-1}},
 {"$project":{"statusValue":0}}
])

旁注:" inital"中有一个拼写错误。应该是"初始"。相应调整。

答案 2 :(得分:0)

聚合可以用于高级自定义排序,但是在这种情况下,您可以使用Sort()方法。 因此,让我向您简要介绍Mongo中的排序方法

“ sort()方法用于对MongoDB中的文档进行排序,您需要使用sort()方法。该方法接受包含字段列表及其排序顺序的文档。要指定排序顺序1和-1为使用。1表示升序,-1表示降序。“

因此,在您的情况下,请使用sort()方法:

按状态排序,而不是按create_time排序:

db.test.find().sort({status:-1, create_time:1})