抱歉我的英语不太好。
我想按照这种方式进行排序:'initial'
状态首先排序,然后按照 'create_time'
进行排序。这是可能的吗?我猜测 'aggregate'
可能有帮助,但我不知道它如何在这种情况下使用。
抱歉我的英语不太好。
我想按照这种方式进行排序:'initial'
状态首先排序,然后按照 'create_time'
进行排序。这是可能的吗?我猜测 'aggregate'
可能有帮助,但我不知道它如何在这种情况下使用。
$indexOfArray
定位“initial”的位置,当找到状态时为0,否则为-1(其他所有文档)并使用$addFields
将输出索引保留在文档中的额外字段中,随后使用$sort
对字段进行排序。$project
排除排序字段以获取预期的输出。 db.col.aggregate([
{
"$addFields":{
"statusValue":{
"$indexOfArray":[
["initial"], "$status"
]
}
}
},
{
"$sort":{
"statusValue":-1, "create_time":-1
}
},
{
"$project":{
"statusValue":0
}
}
])
补充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中的数据类型。db.test.find().sort({status:-1, create_time:1})