抱歉我的英文。
我希望按此排序,'initial'
状态排序优先,然后按'create_time'
排序。这可能吗?我想'aggregate'
可能会有所帮助,但我不知道如何在这种情况下使用它。
答案 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 Queries和Use 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})