猿教程 Logo

.Net连接MongoDb:第一个聚合实例

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

介绍

在上一篇文章中,我们介绍了一般的聚合主题。 MongoDb中的聚合在SQL中与GROUP BY子句的目的相似。 它们帮助我们分析存储在数据库中的数据,以便了解长期业务趋势,用户和客户行为等方面的事情,我们业务的哪一部分造成损失和类似。 使用$运算符将聚合查询添加到聚合管道,并将文档从一个阶段传递到下一个流水线。 我们将在流水线末尾获取聚合结果。

在这篇文章中,我们将看看我们的第一个聚合示例。

按状态查找总人口

就像在这里提醒一个zipcodes演示集合的一个文件:

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

在这个第一个练习中,我们想把国家的文件分组,并总结出每个国家的人口。

我们将从解决方案开始,然后我们将通过一个解释。 以下是Mongo客户端中的查询:

db.zipcodes.aggregate([{"$group":{"_id":"$state", "population":{$sum:"$pop"}}}])

聚合由接受查询文档数组的“聚合”函数表示。 每个查询文档表示在某种程度上转换起始集合的流水线。

我们开始的集合当然是整个邮政编码集合。 MongoDb将逐个浏览每个文档,并在其上执行分配的聚合阶段以产生其他文档。 这是聚合结果的一部分:

{ "_id" : "MN", "population" : 4372982 }
{ "_id" : "SC", "population" : 3486703 }
{ "_id" : "RI", "population" : 1003218 }
{ "_id" : "OK", "population" : 3145585 }
{ "_id" : "MA", "population" : 6016425 }
{ "_id" : "SD", "population" : 695397 }

所以我们有一个国家的文件。

$ group运算符表示我们希望通过某些键对集合进行分组。 $ group运算符像所有聚合阶段运算符一样,接受具有各种参数的JSON文档。 我们要对集合进行分组的键由_id字段指示。 这是强制性的论据,必须称为_id。 如果你写“id”或“mickeymouse”,那么你会得到一个错误:

“errmsg”:“组聚合字段'id'必须定义为对象内的表达式”

关键是来自源文档的一个字段,我们将通过“state”属性聚合。 源文档中的字段必须以$符号为前缀,因此$状态输入。 如果你错过了$运算符,它将被理解为生成的文档中的独立字段:

db.zipcodes.aggregate([{"$group":{"_id":"state", "population":{$sum:"$pop"}}}])

以上查询结果总收入不分国家:

{ "_id" : "state", "population" : 248408400 }

查询文档中的下一个属性是“人口”。 我们要为所得到的文档“population”添加一个新的字段,我们希望它是人口的总和。

$ sum运算符相当于SQL COUNT()函数,它只是计数内容。 我们再次回到名为$ pop的邮政编码集合中的现有属性。

所以我们现在有一个聚合流水线,只有一个阶段。 MongoDb将查看收集中的每个文档,并生成结果集合,大致如下:

  • 它需要第一个文档并看到state = MA

  • 它将尝试通过此密钥更新文档的结果集

  • 由于这是这个密钥的第一个文档,因此MongoDb将使用key = MA将新文档插入到结果集中

  • MongoDb看到它必须将第一个文档的人口添加到结果文档中,因为在这一点上它是0,它只是将15338添加到0

  • 在这一点上,我们拥有第一个文档,其中包含键 - _id-MA和一个名为“population”的属性,值为15338

  • 然后下一个可能有状态SC的文档,由于没有该密钥的结果文档,它将以与上述“MA”相同的方式添加,

  • 最终MongoDb将遇到另一个状态为“MA”的文档

  • 由于已经有该ID的结果文档,因此第二个文档的总体将被简单地添加到结果集中的值

  • ...并且该过程继续,直到所有文档都被处理

因此,MongoDb将在此过程中执行一系列升级插件:如果没有给定的_id或UPDATE的文档(如果有),则将新文档插入到结果集中。 在过程结束时,即当所有的邮政编码文件都被考虑在内时,我们将得到结果文件集。

$ sum运算符也可以像SQL中的COUNT(*)一样使用,即只计算一个记录的出现次数。 例如。 如果我们要根据状态获取邮政编码的数量,我们可以有以下查询:

db.zipcodes.aggregate([{"$group":{"_id":"$state", "count":{$sum: 1}}}])

所以我们有$ sum:1而不是$ sum:$ pop。 我们不引用源文档中的任何属性,但是在通过源文档时只需要MongoDb将1添加到计数字段。 这是结果的一部分:

{ "_id" : "MN", "count" : 882 }
{ "_id" : "SC", "count" : 350 }
{ "_id" : "RI", "count" : 69 }
{ "_id" : "OK", "count" : 586 }
{ "_id" : "MA", "count" : 474 }

我们会在下一篇文章中继续关注聚合。

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


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