Docs 菜单
Docs 主页
/ / /
C#/.NET
/

指定查询

在此页面上

  • Overview
  • 字面值
  • 比较操作符。
  • 逻辑操作符
  • 数组操作符
  • 元素操作符
  • 评估操作符
  • 更多信息

在本指南中,您可以了解如何使用 MongoDB .NET/C# 驱动程序指定查询。

您可以通过创建查询筛选器来缩小查询返回的匹配文档集的范围。查询筛选器是一个表达式,用于指定要在读取、更新或删除操作中匹配的文档。

注意

使用 LINQ

本指南介绍如何使用查询筛选器指定查询。 还可以使用 LINQ 指定查询。 要学习;了解有关使用 LINQ 的更多信息,请参阅 LINQ。

本指南中的示例使用名为 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
生成器
说明

>

Gt()

大于

<=

Lte()

小于或等于

!=

Ne()

不等于

有关比较运算符的完整列表,请参阅比较查询运算符页面。

以下示例将查询筛选器指定为 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
生成器
说明

&&

And()

所有表达式的计算结果都必须为 True。

||

Or()

至少有一个表达式的计算结果必须为 True。

有关逻辑运算符的完整列表,请参阅“逻辑查询运算符”页面。

以下示例将查询筛选器指定为 Find() 方法的参数。该查询匹配 establishedYear 字段大于或等于 1985make 字段不等于 "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
说明

All()

如果数组字段包含查询中指定的所有元素,则匹配文档。

Any()

如果数组字段中的任意元素与指定的查询筛选器匹配,则匹配文档。

Size()

如果数组字段为指定大小,则匹配文档。

注意

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

后退

BSON 操作