猿教程 Logo

.Net连接MongoDb:.NET驱动程序中使用松散类型和AppendStage进行聚合

阿里云服务器,每月低至7.8元,项目演示即建站必备,比腾讯云更便宜,并且不需学生认证,从此链接购买有效:去购买

介绍

在上一篇文章中,我们开始通过.NET驱动程序查找MongoDb的汇总。 我们的第一个例子是使用AppendStage函数的单个$ sort阶段。 AppendStage功能是通用的,它只能接受任何类型的要添加到管道中的聚合阶段。 我们还介绍了BsonDocument对象,它提供了一种以松散类型的方式描述MongoDb文档的方法。

在这篇文章中,我们将继续讨论并构建我们所针对的管道。

AppendStage的更多阶段

回想一下我们如何使用AppendStage和BsonDocument添加$ sort stage:

ModelContext modelContext = ModelContext.Create(new ConfigFileConfigurationRepository(), new AppConfigConnectionStringRepository());
var res = modelContext.ZipCodes.Aggregate()
	.AppendStage<BsonDocument>(new BsonDocument { { "$sort", new BsonDocument("_id", 1) } }).ToList();

我们继续沿着这些路线 在这里提醒我们要实现的目标:

db.zipcodes.aggregate([
{$group: { "_id" : "$state", "population" : {$sum : "$pop"}}}, 
{$match : {population : {$gte : 5000000}}}, 
{$sort: {"_id" : 1}}, 
{$limit : 5}])

使用BsonDocument对象可以如下构建组阶段JSON文档:

BsonDocument groupStageBson = new BsonDocument { { "$group", new BsonDocument("_id", "$state")
					.Add("population", new BsonDocument("$sum", "$pop")) } };

这相当于...

{ "$group" : { "_id" : "$state", "population" : { "$sum" : "$pop" } } }

匹配阶段可以表示如下:

BsonDocument matchStageBson = new BsonDocument { { "$match", new BsonDocument("population", new BsonDocument("$gte", 5000000)) } };

我们已经看到BsonDocument等同于排序阶段。 限制阶段是一个容易的,所以我只是使用AppendStage提交最终查询:

List<BsonDocument> looselyTypedAggregation = modelContext.ZipCodes.Aggregate()
	.AppendStage<BsonDocument>
	(
		new BsonDocument { { "$group", new BsonDocument("_id", "$state")
			.Add("population", new BsonDocument("$sum", "$pop")) } }
	)
	.AppendStage<BsonDocument>
	(
		new BsonDocument { { "$match", new BsonDocument("population", new BsonDocument("$gte", 5000000)) } }
	)
	.AppendStage<BsonDocument>
	(
		new BsonDocument { { "$sort", new BsonDocument("_id", 1) } }
	)
	.AppendStage<BsonDocument>
	(
		new BsonDocument("$limit", 5)
	)
	.ToList();
foreach (var item in looselyTypedAggregation)
{
	var nameList = item.Names.ToList();
	foreach (string name in nameList)
	{
		BsonValue bsonValue = item.GetValue(name);
		Console.WriteLine(string.Format("{0}: {1}", name, bsonValue));
	}
}

以下是上述代码片段的输出:

_id:CA人口:29754890 _id:FL人口:12686644 _id:GA人口:6478216 _id:IL人口:11427576 _id:IN人口:5544136

...这与我们在上一篇文章中看到的预期文件相同:

{ "_id" : "CA", "population" : 29754890 }
{ "_id" : "FL", "population" : 12686644 }
{ "_id" : "GA", "population" : 6478216 }
{ "_id" : "IL", "population" : 11427576 }
{ "_id" : "IN", "population" : 5544136 }

我们已经看到在.NET编写器中编写聚合的一种替代方法。 它与字符串和BsonDocuments非常松散地类型,与编写实际的JSON代码没有太大的区别。

在下一篇文章中,我们将使用聚合流畅API的专用聚合方法来查看更强类型的解决方案。

阿里云服务器,每月低至7.8元,项目演示即建站必备,比腾讯云更便宜,并且不需学生认证,从此链接购买有效: 去购买


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