猿教程 Logo

.Net连接MongoDb:使用.net驱动执行聚合操作

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

介绍

在上一篇文章中,我们研究了MongoDb中的各种其他聚合操作。 使用$ first和$ last,我们可以在排序集合中找到最高和最低的成员。 如果你需要找到例如 人口最多的城市或人均宠物人数最少的国家,这些运营商可能会在汇集线上。 $ unwind舞台操作员吹灭数组的成员,以便我们可以以更简单的方式对这些成员运行查询。 没有$ unwind,很难访问数组的各个成员。 请注意,$ unwind可以大大增加文档的结果集。

我们现在已经经历了MongoDb中最重要的聚合运算符。 现在是将注意力转移到如何在.NET驱动程序中编写聚合。

初始点

我们将通过.NET驱动程序在zipcodes集合上运行聚合。 作为提醒,这里是邮政编码文件的结构:

{
        "_id" : "01001",
        "city" : "AGAWAM",
        "loc" : [
                -72.622739,
                42.070206
        ],
        "pop" : 15338,
        "state" : "MA"
}

我们要提取的人口超过500万的国家,按国家排列所得的文件,取第5份文件。 以下是纯JavaScript的查询:

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

这是结果集:

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

我们在本教程本部分的目标是以各种方式在C#中描述上述JavaScript查询。

聚合方法

我们将看看在.NET驱动程序中编写汇总的各种方法。 请注意,并非所有聚合阶段都由专用功能支持。 例如。 我们在本系列中没有讨论过的$完美阶段在驱动程序中没有相应的内容。

.NET驱动程序中的聚合网关是Aggregate函数,它有两种形式。

第一个不需要强制参数,只需要一个optionL AggregateOptions参数。 该功能打开流畅的API,我们可以附加各种流水线阶段。 将一个阶段附加到管道的最通用的功能称为AppendStage。 我们可以添加任何类型的舞台到管道。

我们还需要熟悉名为BsonDocument的MongoDb对象。 在这个系列中,我一直在避免这个问题。 它是一个通用对象来表示任何类型的MongoDb文档。 如果在我们的代码中有一个没有强类型对象表示的文档,我们总是可以转到BsonDocument。 实际上,我们只能使用BsonDocuments来完成本教程,而不是像ZipCodeDb和RestaurantDb那样构建强类型的对象。 我是一个很好的粉丝,强力打字,所有的好处,所以我不鼓励你用BsonDocuments描述你的文件。

然而,BsonDocument可以方便地进行聚合,因为在各种流水线阶段中更容易描述我们想要的内容,而不是每个阶段都有强类型的对象。 让我们一步一步地尝试一次聚合类型。 我们将使用Aggregate,AppendStage和BsonDocument进行排序阶段:

ModelContext modelContext = ModelContext.Create(new ConfigFileConfigurationRepository(), new AppConfigConnectionStringRepository());
var res = modelContext.ZipCodes.Aggregate()
	.AppendStage<BsonDocument>(new BsonDocument { { "$sort", new BsonDocument("_id", 1) } }).ToList();
foreach (var item in res)
{
	var nameList = item.Names.ToList();
	foreach (string name in nameList)
	{
		BsonValue bsonValue = item.GetValue(name);
		Console.WriteLine(string.Format("{0}: {1}", name, bsonValue));
	}
}

当您在Visual Studio中键入“modelContext.ZipCodes.Aggregate()”时,您会看到IntelliSense提供了广泛的专用流水线阶段,例如Limit,Match等。我们不要急于开始,而是从AppendStage开始,因为它使我们能够 将任何类型的聚合添加到管道。

我们可以在上面的代码中看到BsonDocument对象。 以下代码...:

new BsonDocument { { "$sort", new BsonDocument("_id", 1) } }

...是在JavaScript中构建以下内容的松散类型的方法:

{$sort: {"_id" : 1}}

“AppendStage”表示我们要将结果集检索为BsonDocument对象的列表。 这是为了演示如何从BsonDocument中提取属性和值。 列表中的每个BsonDocument项都将有一个Name属性,它表示该键,或者“列”,如果你愿意的话。 我们可以拿这个名字,并从中提取相应的值。

以下是前3项的输出:

_id: 01001
city: AGAWAM
loc: [-72.622739, 42.070206]
pop: 15338
state: MA
_id: 01002
city: CUSHMAN
loc: [-72.51565, 42.377017]
pop: 36963
state: MA
_id: 01005
city: BARRE
loc: [-72.108354, 42.409698]
pop: 4546
state: MA

您将会识别我们的邮政编码集合中的属性。

由于$ sort不影响文档结构,我们可以将这些对象转换为强类型的ZipCodeDb对象。

以下是修改后的代码:

var stronglyTypedRes = modelContext.ZipCodes.Aggregate()
				.AppendStage<ZipCodeDb>(new BsonDocument { { "$sort", new BsonDocument("_id", 1) } }).ToList();
foreach (var item in stronglyTypedRes)
{
	Console.WriteLine(item);
}

以下是前3项的输出:

{
  "Id": "01001",
  "City": "AGAWAM",
  "Coordinates": [
    -72.622739,
    42.070206
  ],
  "Population": 15338,
  "State": "MA"
}
{
  "Id": "01002",
  "City": "CUSHMAN",
  "Coordinates": [
    -72.51565,
    42.377017
  ],
  "Population": 36963,
  "State": "MA"
}
{
  "Id": "01005",
  "City": "BARRE",
  "Coordinates": [
    -72.108354,
    42.409698
  ],
  "Population": 4546,
  "State": "MA"
}

我们将在下一篇文章中继续探索.NET驱动程序中的聚合。

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


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