Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database MongoDB如何按多个字段进行排序?_Database_Mongodb - Fatal编程技术网

Database MongoDB如何按多个字段进行排序?

Database MongoDB如何按多个字段进行排序?,database,mongodb,Database,Mongodb,对不起我的英语。 我想像这样排序,'initial'首先进行状态排序,然后按'create\u time'排序。这可能吗?我想,'aggregate'可能会有帮助,但我不知道如何在这种情况下使用它。您可以尝试在3.4中的聚合下面进行自定义排序 当所有其他文档的状态为-1时,用于定位“initial”(初始)的位置0,并将输出索引保留在文档的额外字段中,然后在字段上排序 使用exclusion删除排序字段以获得预期输出 排序时,所有初始状态文档显示在顶部,然后在创建时排序 db.col.aggre

对不起我的英语。
我想像这样排序,
'initial'
首先进行状态排序,然后按
'create\u time'
排序。这可能吗?我想,
'aggregate'
可能会有帮助,但我不知道如何在这种情况下使用它。

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

当所有其他文档的状态为-1时,用于定位“initial”(初始)的位置0,并将输出索引保留在文档的额外字段中,然后在字段上排序

使用exclusion删除排序字段以获得预期输出

排序时,所有初始状态文档显示在顶部,然后在创建时排序

db.col.aggregate([
{
“$addFields”:{
“状态值”:{
“$indexOfArray”:[
[“初始”],“$status”
]
}
}
}, 
{
“$sort”:{
“状态值”:-1,“创建时间”:-1
}
},
{
“$project”:{
“状态值”: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"
}
请注意,上面示例中的排序顺序使用字符串排序,因此
禁用
将位于
启用
之前,因为它是按字母顺序排序的。与
create\u time
排序顺序相同,排序顺序基于字符串比较排序

有关排序
create\u time
的更丰富选项,需要将字段转换为
ISODate()
对象。看到和

像这样使用游标排序的一个优点是使用索引。如果索引正确,查询可以很快,而不需要在内存中排序,因为MongoDB使用索引执行排序。见和


如果您对其中任何一个概念都不熟悉,我建议您阅读有关MongoDB的免费课程。

聚合可用于高级自定义排序,但在这种情况下,您可以使用sort()方法。 让我来给你们介绍一下Mongo中的排序方法

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

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

按状态排序而不是按创建时间排序:

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

MongoDB解释了如何在文档中执行此操作:状态的顺序是什么?请提供一个示例文档以及一个示例排序结果。@KevinAdistambha抱歉,我是stackoverflow新手。上面有一个链接显示了我的示例。我想先获得“初始”状态,然后按“创建时间”字段排序。@Saravana我想先获取“初始”状态文档,然后按“创建时间”字段排序其他文档。谢谢你Kevin,我认为MongoDB很容易入门,但很难掌握,前面还有很长的路要走,哈哈。我会在你上面提到的内容中了解更多,谢谢!