Docs 菜单
Docs 主页
/ / /
Rust 驱动程序
/ / /

对结果进行排序

在此页面上

  • Overview
  • 示例样本数据
  • 排序方法
  • 选项
  • 聚合(Aggregation)
  • 排序方向
  • 升序
  • 降序
  • 更多信息
  • API 文档

在本指南中,您可以学习;了解如何使用MongoDB Rust驱动程序执行排序操作,以指定读取操作结果的顺序。

构建选项以更改读取操作返回文档的顺序时,请使用 sort() 方法。sort() 方法指示MongoDB按一个或多个字段的值以某一方向对返回的文档进行排序。要按字段以升序(从低到高的顺序)对返回的文档进行排序,请使用值 1 。要改为按降序(从高到低的顺序)排序,请使用 -1 。如果不指定排序, MongoDB不保证查询结果的顺序。

本指南中的示例使用以下 Book 结构作为 books 集合中文档的模型:

#[derive(Debug, Serialize, Deserialize)]
struct Book {
name: String,
author: String,
length: i32,
}

以下代码演示如何将示例数据插入 books集合:

let uri = "connection string";
let client = Client::with_uri_str(uri).await?;
let my_coll: Collection<Book> = client.database("db").collection("books");
let books = vec![
Book {
id: 1,
name: "The Brothers Karamazov".to_string(),
author: "Dostoyevsky".to_string(),
length: 824,
},
Book {
id: 2,
name: "Atlas Shrugged".to_string(),
author: "Rand".to_string(),
length: 1088,
},
Book {
id: 3,
name: "Les Misérables".to_string(),
author: "Hugo".to_string(),
length: 1462,
},
Book {
id: 4,
name: "A Dance with Dragons".to_string(),
author: "Martin".to_string(),
length: 1104,
},
];
my_coll.insert_many(books).await?;

您可以对查询检索的结果进行排序,也可以在聚合管道内对结果进行排序。

sort() 方法链接到 find() 方法,对查询检索的结果进行排序,如以下示例所示:

let mut cursor = my_coll
.find(doc! {})
// 1 for ascending order, -1 for descending order
.sort(doc! { "author": 1 })
.await?;
while let Some(result) = cursor.try_next().await? {
println!("{:?}", result);
}

或者,您可以使用 FindOptions 结构的 sort() 方法。

以下示例通过以下行为执行 find() 操作:

  • author字段值的升序对结果进行排序

  • 跳过第一个文档

  • 返回剩余文档

let find_options = FindOptions::builder()
// 1 for ascending order, -1 for descending order
.sort(doc! { "author": 1 })
.skip(1)
.build();
let mut cursor = my_coll.find(doc! {}).with_options(find_options).await?;
while let Some(result) = cursor.try_next().await? {
println!("{:?}", result);
}

要对聚合管道中的结果进行排序,请创建 $sort 阶段并将阶段列表传递给 aggregate() 方法。

以下示例展示了如何创建 $sort 阶段,以按 author字段的值升序对文档进行排序:

let pipeline = vec![
doc! { "$match": {} },
// 1 for ascending order, -1 for descending order
doc! { "$sort": { "author": 1 } }
];
let mut cursor = my_coll.aggregate(pipeline).await?;
while let Some(result) = cursor.try_next().await? {
println!("{:?}", result);
}

排序方向可以是升序,也可以是降序。 升序排序可将结果从小到大进行排序。 降序排序将结果按从大到小的顺序排列。

以下列表包含按升序排序的数据示例:

  • 数字:1、2、3、43、43、55、120

  • 日期:1990-03-10、1995-01-01、2005-10-30、2005-12-21

  • 单词 (ASCII):Banana,Dill,carrot,cucumber,hummus

以下列表包含按降序排序的数据示例:

  • 数字:100、30、12、12、9、3、1

  • 日期:2020 年 1 月 1 日、1998 年 12 月 11 日、1998 年 12 月 10 日、1975 年 7 月 22 日

  • 单词(反向 ASCII):pear、graves、apple、Cheese

以下各小节介绍如何指定这些排序条件。

要指定升序排序,请将要作为排序依据的字段和 1 传递给 sort() 方法。

以下示例将对 name 字段指定升序排序:

let mut cursor = my_coll
.find(doc! {})
.sort(doc! { "name": 1 })
.await?;
while let Some(result) = cursor.try_next().await? {
println!("{:?}", result);
}
Book { "_id": 4, "name": "A Dance with Dragons", "author": Martin, "length": 1104 }
Book { "_id": 2, "name": "Atlas Shrugged", "author": Rand, "length": 1088 }
Book { "_id": 3, "name": "Les Miserables", "author": Hugo, "length": 1462 }
Book { "_id": 1, "name": "The Brothers Karamazov", "author": Dostoevsky, "length": 824 }

要指定降序排序,请将要作为排序依据的字段和 -1 传递给 sort() 方法。

以下示例指定对 name 字段进行降序排序:

let mut cursor = my_coll
.find(doc! {})
.sort(doc! { "name": -1 })
.await?;
while let Some(result) = cursor.try_next().await? {
println!("{:?}", result);
}
Book { "_id": 1, "name": "The Brothers Karamazov", "author": Dostoevsky, "length": 824 }
Book { "_id": 3, "name": "Les Miserables", "author": Hugo, "length": 1462 }
Book { "_id": 2, "name": "Atlas Shrugged", "author": Rand, "length": 1088 }
Book { "_id": 4, "name": "A Dance with Dragons", "author": Martin, "length": 1104 }

要学习;了解有关本指南中提及的操作的更多信息,请参阅以下内容:

  • 指定查询

  • Retrieve Data

  • 复合运算符

  • 聚合(Aggregation)

  • 跳过返回的结果

要进一步了解本指南所讨论的任何方法或类型,请参阅以下 API 文档:

  • find()

  • FindOptions

  • FindOneOptions

  • Cursor

  • 聚合(aggregate)()

  • AggregateOptions

后退

搜索文本