猿教程 Logo

.Net连接MongoDb:各种查询相关方法

介绍

在上一篇文章中,我们开始研究MongoDb .NET驱动程序公开的查询技术。 我们研究了构建查询的两种方法:过滤器定义构建器和LINQ样式查询。 过滤器定义构建器在我的经验中更强大,这意味着它们提供比LINQ风格版本更复杂的查询技术。 我们将过滤器应用于可以附加到由T界面的IMongoCollection表示的Mongo集合的查找扩展方法。 在驱动程序中还有其他与find相关的方法,称为FindSync及其等待的FindAsync,但我认为Find扩展方法更灵活。

在这篇文章中,我们将介绍可以附加到我们的搜索的各种与查询相关的函数。 它们对应于在Mongo shell中工作时我们前面提到的一些功能:计数,限制,跳过和排序。

结果技术

这是一个容易的。 记住count()JavaScript函数返回一个查询返回的元素数量? 毫不奇怪,有一个Count()函数在驱动程序中执行相同的操作。 它可以附加到查找扩展功能,如下所示:

ModelContext modelContext = ModelContext.Create(new ConfigFileConfigurationRepository(), new AppConfigConnectionStringRepository());
var boroughFilter = Builders<RestaurantDb>.Filter.Eq(r => r.Borough, "Brooklyn");
long restaurantsInBrooklyn = modelContext.Restaurants.Find(boroughFilter).Count();

结果会告诉我,在布鲁克林有6086个餐馆。 Count()也有一个异步版本CountAsync。

分页

分页功能使用Skip和Limit函数完成,它们都接受一个整数参数:

var restaurantsInBrooklyn = modelContext.Restaurants.Find(boroughFilter).Skip(10).Limit(10).ToList();

排序

有两种样式的语法来定义排序算法,如在过滤的情况下:LINQ样式和定义构建器样式,除了定义现在称为SortDefinition而不是FilterDefinition。 排序定义与过滤器定义的方式大致相同。 我们来看前5名餐馆,并按餐厅ID排序,即不是默认的_id字段,而是餐厅ID:

var idSortDefinition = Builders<RestaurantDb>.Sort.Ascending(r => r.Id);
var restaurantsInBrooklyn = modelContext.Restaurants.Find(boroughFilter).Limit(5).Sort(idSortDefinition).ToList();

Builders的Sort属性是构建排序定义的网关,就像Filter属性可以帮助我们构建过滤器定义一样。 Linq表达式选择要对结果集进行排序的字段。

Sort属性还会显示一个Descending方法,您可能会猜测它的作用。 另一个重要的方法称为组合,我们可以定义多个排序算法。 让我们在邮政编码集合上尝试一下,按升序排序地方,然后按名称降序排序:

var idSortDefinition = Builders<RestaurantDb>.Sort.Ascending(r => r.Id);
var zipSortByState = Builders<ZipCodeDb>.Sort.Ascending(z => z.State);
var zipSortByName = Builders<ZipCodeDb>.Sort.Descending(z => z.City);
var combinedSort = Builders<ZipCodeDb>.Sort.Combine(zipSortByState, zipSortByName);
var first100zips = modelContext.ZipCodes.Find(z => true).Limit(100).Sort(combinedSort).ToList();

可以使用可以附加到排序定义构建器的Ascending和Descending扩展方法来实现组合排序。 这是一个替代解决方案:

var zipCombinedSortAlternative = Builders<ZipCodeDb>.Sort.Ascending(z => z.State).Descending(z => z.City);
var first100zipsAlternative = modelContext.ZipCodes.Find(z => true).Limit(100).Sort(zipCombinedSortAlternative).ToList();

LINQ样式解决方案由SortBy和SortByAscending扩展方法实现,而后者又可以附加到Find扩展方法。 可以使用ThenBy和ThenByDescending扩展方法构建组合查询。 这是上面例子的LINQ等价物:

var first100zipsLinqSolution = modelContext.ZipCodes.Find(z => true).Limit(100).SortBy(z => z.State).ThenByDescending(z => z.City).ToList();

关于这一点,真的没有什么可说的这些功能,它们很简单。

在下一篇文章中,我们将介绍插入。


版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/CsharpMongo/17.html