文档菜单
文档首页
/ / /
C#/.NET
/ / /

检索数据

本页内容

  • 概述
  • 示例数据
  • 查找文档
  • 查找单个文档
  • 查找多个文档
  • 修改查找行为
  • 示例
  • 更多信息
  • API 文档

在本指南中,您可以了解如何使用MongoDB .NET/C# 驱动程序通过读取操作从MongoDB集合中检索数据。您可以调用Find() 方法来检索匹配一组条件的文档。

提示

交互式实验室

此页面包含一个简短的交互式实验室,演示了如何使用 Find() 方法检索数据。您可以直接在浏览器窗口中完成此实验室,无需安装MongoDB或代码编辑器。

要启动实验室,请点击打开交互式教程 按钮,位于页面顶部。要将实验室扩展到全屏格式,请点击实验室面板右上角的全屏按钮 ()。

本指南中的示例使用来自Atlas 示例数据集sample_restaurants.restaurants 集合。有关如何创建免费MongoDB Atlas集群并加载数据集的说明,请参阅快速入门.

此页面的示例使用以下 RestaurantAddressGradeEntry 类作为模型

public class Restaurant
{
public ObjectId Id { get; set; }
public string Name { get; set; }
[BsonElement("restaurant_id")]
public string RestaurantId { get; set; }
public string Cuisine { get; set; }
public Address Address { get; set; }
public string Borough { get; set; }
public List<GradeEntry> Grades { get; set; }
}
public class Address
{
public string Building { get; set; }
[BsonElement("coord")]
public double[] Coordinates { get; set; }
public string Street { get; set; }
[BsonElement("zipcode")]
public string ZipCode { get; set; }
}
public class GradeEntry
{
public DateTime Date { get; set; }
public string Grade { get; set; }
public float? Score { get; set; }
}

注意

restaurants 集合中的文档使用蛇形命名约定。本指南中的示例使用 ConventionPack 将集合中的字段反序列化为 Pascal 大小写,并将它们映射到 Restaurant 类的属性。

要了解更多关于自定义序列化的信息,请参阅自定义序列化。

使用Find()方法从集合中检索文档。该方法接受一个查询过滤器并返回所有匹配的文档。查询过滤器是一个对象,指定了您查询中想要检索的文档。

要了解更多关于查询过滤器的信息,请参阅指定查询。

要在一个集合中查找单个文档,传递一个指定您要查找的文档标准的查询过滤器,然后链式调用FirstOrDefault()FirstOrDefaultAsync()方法。如果有多个文档匹配查询过滤器,这些方法将返回检索结果中的第一个匹配文档。如果没有文档匹配查询过滤器,这些方法将返回null

var restaurants = await _restaurantsCollection.Find(filter).FirstOrDefaultAsync();
var restaurants = _restaurantsCollection.Find(filter).FirstOrDefault();

提示

第一个文档

如果没有指定排序标准,FirstOrDefault()方法返回磁盘上的第一个文档,按照自然顺序

要查看使用Find()方法查找单个文档的完整示例,请参阅附加信息。

要在集合中查找多个文档,请将查询过滤器传递给Find()方法,以指定要检索的文档的准则。

您可以使用一个游标来遍历由Find()方法返回的文档。游标是一种机制,允许应用程序在内存中只保留一部分结果的同时遍历数据库结果。当您的Find()方法返回大量文档时,游标非常有用。

要使用游标遍历文档,请将查询过滤器传递给Find()方法,以指定要查找的文档的准则,然后链式调用ToCursor()ToCursorAsync()方法。要查看同步或异步示例,请选择相应的选项卡。

var restaurants = await _restaurantsCollection.Find(filter).ToCursorAsync();
var restaurants = _restaurantsCollection.Find(filter).ToCursor();

如果您返回少量文档或需要将结果作为List对象返回,请使用ToList()ToListAsync()方法。

要查找集合中的多个文档并将其作为列表保存在内存中,请将查询过滤器传递给Find()方法,以指定要查找的文档的准则,然后链式调用ToList()ToListAsync()方法。要查看同步或异步示例,请选择相应的选项卡。

var restaurants = await _restaurantsCollection.Find(filter).ToListAsync();
var restaurants = _restaurantsCollection.Find(filter).ToList();

要查看使用Find()方法查找多个文档的完整示例,请参阅更多信息。

注意

查找所有文档

要查找集合中的所有文档,请将空过滤器传递给Find()方法。

var filter = Builders<Restaurant>.Filter.Empty;
var allRestaurants = _restaurantsCollection.Find(filter);

要查看使用Find()方法查找所有文档的完整示例,请参阅更多信息。

您可以通过传递一个 FindOptions 对象来修改 Find() 方法的行为。

您可以使用以下方法配置常用选项

方法
描述

BatchSize

获取或设置在给定时间内游标中保持的文档数。

Collation

设置排序选项。

Comment

将注释设置到查询中。有关查询注释的更多信息,请参阅$comment 页面。

Hint

设置用于哪个索引的提示。

MaxTime

设置此操作在服务器上的最大执行时间。

要查看可用选项的完整列表,请参阅 FindOptions 属性。

此示例执行以下操作

  • 查找所有在 cuisine 字段中包含 "Pizza" 的文档

  • BatchSize 设置为 3

  • 将结果存储在游标中

  • 打印由游标引用的文档

var filter = Builders<Restaurant>.Filter.Eq("cuisine", "Pizza");
var findOptions = new FindOptions { BatchSize = 3 };
using (var cursor = _restaurantsCollection.Find(filter, findOptions).ToCursor())
{
foreach (var r in cursor.ToEnumerable())
{
WriteLine(r.Name);
}
}
Pizza Town
Victoria Pizza
...

提示

清理

使用一个 using语句来自动调用Dispose()方法,一旦游标不再使用。

要了解更多关于查询过滤器的信息,请参阅指定查询。

要了解如何使用LINQ指定查询,请参阅LINQ。

要查看Find()方法的可运行示例,请参阅查找文档页面。

要了解更多关于本指南中讨论的任何方法或类型,请参阅以下API文档

后退

读取