指定查询
Overview
在本指南中,您可以了解如何使用 MongoDB .NET/C# 驱动程序指定查询。
您可以通过创建查询筛选器来缩小查询返回的匹配文档集的范围。查询筛选器是一个表达式,用于指定要在读取、更新或删除操作中匹配的文档。
本指南中的示例使用名为 guitars
的集合中的以下文档:
{ "_id": 1, "make": "Fender", "models": ["Stratocaster", "Telecaster"], "establishedYear": 1946, "rating": 9 } { "_id": 2, "make": "Gibson", "models": ["Les Paul", "SG", "Explorer"], "establishedYear": 1902, "rating": 8 } { "_id": 3, "make": "PRS", "models": ["Silver Sky", "SE", "Custom"], "establishedYear": 1985, "rating": 9 } { "_id": 4, "make": "Kiesel", "models": ["Ares", "Vader", "Solo"], "establishedYear": 2015 } { "_id": 5, "make": "Ibanez", "models": ["RG", "AZ"], "establishedYear": 1957, "rating": 7 } { "_id": 6, "make": "Strandberg", "models": ["Boden", "Salen"], "establishedYear": 1982 }
以下 Guitar
类对此集合中的文档进行建模。
public class Guitar { public int Id { get; set; } public string Make { get; set; } public List<string> Models { get; set; } public int EstablishedYear { get; set; } public int? Rating { get; set; } }
注意
guitars
集合中的文档使用驼峰命名约定。本指南中的示例使用 ConventionPack
将集合中的字段反序列化为 Pascal 语句,然后映射到 Guitar
类中的属性。
如需了解有关自定义序列化的更多信息,请参阅“自定义序列化”。
如需了解有关类映射的更多信息,请参阅“类映射”。
以下代码使用 Guitar
类作为类型参数来实例化 _guitarsCollection
对象。此类型参数使驱动程序自动将其发送到 MongoDB 和从 MongoDB 接收的文档自动序列化和反序列化为 Guitar
类的实例:
private static IMongoCollection<Guitar> _guitarsCollection;
字面值
字面值查询返回与查询筛选器精确匹配的文档。
以下示例将查询筛选器指定为 Find()
方法的参数。该查询匹配 make
字段等于 " Fender " 的所有文档。
// Finds all documents with a "make" value of "Fender" var results = _guitarsCollection.Find(g => g.Make == "Fender").ToList(); foreach (var doc in results) { // Prints the documents in bson (json) format Console.WriteLine(doc.ToBsonDocument()); }
{ "_id" : 1, "make" : "Fender", "models" : ["Stratocaster", "Telecaster"], "establishedYear" : 1946, "rating" : 9 }
以下示例使用构建器创建一个查询筛选器,该筛选器匹配的文档与前面的示例相同:
// Creates a filter for all documents with a "make" value of "Fender" var filter = Builders<Guitar>.Filter.Eq(g => g.Make, "Fender"); // Finds all documents that match the filter var result = _guitarsCollection.Find(filter).ToList(); foreach (var doc in result) { // Prints the documents in bson (json) format Console.WriteLine(doc.ToBsonDocument()); }
{ "_id" : 1, "make" : "Fender", "models" : ["Stratocaster", "Telecaster"], "establishedYear" : 1946, "rating" : 9 }
提示
查找所有文档
使用空查询筛选器匹配集合中的所有文档。用生成器创建空查询筛选器,如下所示:
var result = _guitarsCollection.Find(Builders<Guitar>.Filter.Empty).ToList();
如需了解有关使用生成器的更多信息,请参阅生成器操作。
比较操作符。
比较运算符会根据查询筛选器中的指定值分析文档中的值。常见的比较运算符包括:
Operator | 生成器 | 说明 |
---|---|---|
|
| 大于 |
|
| 小于或等于 |
|
| 不等于 |
有关比较运算符的完整列表,请参阅比较查询运算符页面。
以下示例将查询筛选器指定为 Find()
方法的参数。该查询匹配 establishedYear
字段大于 1985
的所有文档。
// Finds all documents with am "establishedYear" value greater than 1985 var results = _guitarsCollection.Find(g => g.EstablishedYear > 1985).ToList(); foreach (var doc in results) { // Prints the documents in bson (json) format Console.WriteLine(doc.ToBsonDocument()); }
{ "_id" : 4, "make" : "Kiesel", "models" : ["Ares", "Vader", "Solo"], "establishedYear" : 2015, "rating" : null }
以下示例使用构建器创建一个查询筛选器,该筛选器匹配的文档与前面的示例相同:
// Creates a filter for all documents with an "establishedYear" value greater // than 1985 var filter = Builders<Guitar>.Filter.Gt(g => g.EstablishedYear, 1985); // Finds all documents that match the filter var result = _guitarsCollection.Find(filter).ToList(); foreach (var doc in result) { // Prints the documents in bson (json) format Console.WriteLine(doc.ToBsonDocument()); }
{ "_id" : 4, "make" : "Kiesel", "models" : ["Ares", "Vader", "Solo"], "establishedYear" : 2015, "rating" : null }
如需了解有关使用生成器的更多信息,请参阅生成器操作。
逻辑操作符
逻辑操作符使用应用于两组或多组表达式结果的逻辑来匹配文档。以下是一些逻辑操作符的列表:
Operator | 生成器 | 说明 |
---|---|---|
|
| 所有表达式的计算结果都必须为 True。 |
|
| 至少有一个表达式的计算结果必须为 True。 |
有关逻辑运算符的完整列表,请参阅“逻辑查询运算符”页面。
以下示例将查询筛选器指定为 Find()
方法的参数。该查询匹配 establishedYear
字段大于或等于 1985
且 make
字段不等于 "Kiesel" 的所有文档。
// Finds all documents with an "establishedYear" value greater than 1985 // and a "make" value that is not equal to "Kiesel" var results = _guitarsCollection.Find(g => g.EstablishedYear >= 1985 && r.Make != "Kiesel").ToList(); foreach (var doc in results) { // Prints the documents in bson (json) format Console.WriteLine(doc.ToBsonDocument()); }
{ "_id" : 3, "make" : "PRS", "models" : ["Silver Sky", "SE", "Custom"], "establishedYear" : 1985, "rating" : 9 }
以下示例使用构建器创建一个查询筛选器,该筛选器匹配的文档与前面的示例相同:
// Creates a filter for all documents with an "establishedYear" value greater // than 1985 and a "make" value that does not equal "Kiesel" var builder = Builders<Guitar>.Filter; var filter = builder.And(builder.Gte(g => g.EstablishedYear, 1985), builder.Ne(r => r.Make, "Kiesel")); // Finds all documents that match the filter var result = _guitarsCollection.Find(filter).ToList(); foreach (var doc in result) { // Prints the documents in bson (json) format Console.WriteLine(doc.ToBsonDocument()); }
{ "_id" : 3, "make" : "PRS", "models" : ["Silver Sky", "SE", "Custom"], "establishedYear" : 1985, "rating" : 9 }
如需了解有关使用生成器的更多信息,请参阅生成器操作。
数组操作符
数组操作符根据数组字段中元素的值或数量匹配文档。以下是使用数组操作符的构建器方法的列表:
Operator | 说明 |
---|---|
| 如果数组字段包含查询中指定的所有元素,则匹配文档。 |
| 如果数组字段中的任意元素与指定的查询筛选器匹配,则匹配文档。 |
| 如果数组字段为指定大小,则匹配文档。 |
注意
Any()
构建器使用 $elemMatch
查询运算符。
要了解有关$elemMatch
查询选择器的更多信息,请参阅$elemMatch。
有关数组操作符的更多信息,请参阅数组查询操作符页面。
以下示例使用构建器创建一个查询筛选器,该筛选器匹配 models
字段中有 3 个元素的所有文档:
// Creates a filter for all documents with 3 elements in the "models" field var filter = Builders<Guitar>.Filter.Size(g => g.Models, 3); // Finds all documents that match the filter var result = _guitarsCollection.Find(filter).ToList(); foreach (var doc in result) { // Prints the documents in bson (json) format Console.WriteLine(doc.ToBsonDocument()); }
{ "_id" : 2, "make" : "Gibson", "models" : ["Les Paul", "SG", "Explorer"], "establishedYear" : 1902, "rating" : 8 } { "_id" : 3, "make" : "PRS", "models" : ["Silver Sky", "SE", "Custom"], "establishedYear" : 1985, "rating" : 9 } { "_id" : 4, "make" : "Kiesel", "models" : ["Ares", "Vader", "Solo"], "establishedYear" : 2015, "rating" : null }
如需了解有关使用生成器的更多信息,请参阅生成器操作。
元素操作符
元素操作符根据字段的存在或类型查询数据。
有关元素运算符的完整列表,请参阅元素查询运算符页面。
以下示例使用构建器创建一个查询筛选器,该筛选器匹配具有 rating
字段的所有文档:
// Creates a filter for all documents with a populated "ratings" field var filter = Builders<Guitar>.Filter.Exists(g => g.Rating); // Finds all documents that match the filter var result = _guitarsCollection.Find(filter).ToList(); foreach (var doc in result) { // Prints the documents in bson (json) format Console.WriteLine(doc.ToBsonDocument()); }
{ "_id" : 1, "make" : "Fender", "models" : ["Stratocaster", "Telecaster"], "establishedYear" : 1946, "rating" : 9 } { "_id" : 2, "make" : "Gibson", "models" : ["Les Paul", "SG", "Explorer"], "establishedYear" : 1902, "rating" : 8 } { "_id" : 3, "make" : "PRS", "models" : ["Silver Sky", "SE", "Custom"], "establishedYear" : 1985, "rating" : 9 } { "_id" : 5, "make" : "Ibanez", "models" : ["RG", "AZ"], "establishedYear" : 1957, "rating" : 7 }
如需了解有关使用生成器的更多信息,请参阅生成器操作。
评估操作符
计算操作符可分析单个字段的数据,或整个集合的文档的数据。部分使用计算操作符的生成方法包括 Regex()
和 Text()
。
有关评估运算符的完整列表,请参阅评估查询运算符页面。
以下示例使用构建器创建一个查询筛选器,该筛选器匹配 make
字段中具有以字母 "G" 开头的值的所有文档:
// Creates a filter for all documents with a populated "ratings" field var filter = Builders<Guitar>.Filter.Regex(g => g.Make, "^G"); // Finds all documents that match the filter var result = _guitarsCollection.Find(filter).ToList(); foreach (var doc in result) { // Prints the documents in bson (json) format Console.WriteLine(doc.ToBsonDocument()); }
{ "_id" : 2, "make" : "Gibson", "models" : ["Les Paul", "SG", "Explorer"], "establishedYear" : 1902, "rating" : 8 }
如需了解有关使用生成器的更多信息,请参阅生成器操作。
更多信息
有关本指南中提及的运算符的更多信息,请参阅以下服务器手册条目:
如需了解有关使用生成器的更多信息,请参阅“生成器操作”。
要了解如何使用 LINQ 来指定查询,请参阅 LINQ。