检索数据
概述
在本指南中,您可以了解如何使用MongoDB .NET/C# 驱动程序通过读取操作从MongoDB集合中检索数据。您可以调用Find()
方法来检索匹配一组条件的文档。
提示
交互式实验室
此页面包含一个简短的交互式实验室,演示了如何使用 Find()
方法检索数据。您可以直接在浏览器窗口中完成此实验室,无需安装MongoDB或代码编辑器。
要启动实验室,请点击打开交互式教程 按钮,位于页面顶部。要将实验室扩展到全屏格式,请点击实验室面板右上角的全屏按钮 (⛶)。
示例数据
本指南中的示例使用来自Atlas 示例数据集 的 sample_restaurants.restaurants
集合。有关如何创建免费MongoDB Atlas集群并加载数据集的说明,请参阅快速入门.
此页面的示例使用以下 Restaurant
、Address
和 GradeEntry
类作为模型
public class Restaurant { public ObjectId Id { get; set; } public string Name { get; set; } [ ] 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; } [ ] public double[] Coordinates { get; set; } public string Street { get; set; } [ ] 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();
要查看使用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()
方法的行为。
您可以使用以下方法配置常用选项
方法 | 描述 |
---|---|
| 获取或设置在给定时间内游标中保持的文档数。 |
| 设置排序选项。 |
| 将注释设置到查询中。有关查询注释的更多信息,请参阅$comment 页面。 |
| 设置用于哪个索引的提示。 |
| 设置此操作在服务器上的最大执行时间。 |
要查看可用选项的完整列表,请参阅 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 ...
更多信息
要了解更多关于查询过滤器的信息,请参阅指定查询。
要了解如何使用LINQ指定查询,请参阅LINQ。
要查看Find()
方法的可运行示例,请参阅查找文档页面。
API 文档
要了解更多关于本指南中讨论的任何方法或类型,请参阅以下API文档