mongodbaggregate(mongodb aggregate sort)

本篇文章给大家谈谈mongodbaggregate,以及mongodb aggregate sort对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

mongodb Aggregation聚合操作之$unwind

在上一篇  mongodb Aggregation聚合操作之$project  中详细介绍了mongodb聚合操作中的$project使用以及参数细节。本篇将开始介绍Aggregation聚合操作中的unwind操作。

说明:

解析输入文档中的数组字段指历大,为每个元素输出一个文档。每个输出文档都是输入文档,数组字段的值被元素替换。如果字段值为null、缺失或数组为空,则$unwind不会输出文档。

语法:

{ $unwind: field path }

可以将文档传递给$unwind以指定各种行为选项。

{

  $unwind:

    {

      path: field path,

      includeArrayIndex: string,

      preserveNullAndEmptyArrays: boolean

    }

}

参数解析:

path:string类型,数组字段的字段路径。若要指定字段路径,请在字段名称前加上美元符号$并将其括在引号中。

includeArrayIndex:string类型,可选的。用于保存元素的数组索引的新字段的名称。新字段名称不能以美元符号$开头。

preserveNullAndEmptyArrays:boolean类型,可选的。如果为真,如果路径为空、丢失或数组为空,则$unwind输出文档。如果为false,如果路径为空、丢失或数组为空,则$unwind不输出文档。默认值为false。

初始化数据:

db.inventory.insertOne({ "_id" : 1, "item" : "ABC1", sizes: [ "S", "M", "L"] })

示例:按照sizes字段拆分数据

db.inventory.aggregate( [ { $unwind : "$sizes" } ] )

结果:

{ "_id" : 1, "item" : "ABC1", "sizes" : "S" }

{ "_id" : 1, "item" : "ABC1", "sizes" : "M" }

{ "_id" : 1, "item" : "ABC1", "sizes" : "L" }

初始化数据:

db.inventory2.insertMany([

  { "_id" : 1, "item" : "ABC", price: NumberDecimal("80"), "sizes": [ "S", "M", "L"] },

  { "_id" : 2, "item" : "EFG", price: NumberDecimal("120"), "sizes" : [ ] },

  { "_id" : 3, "item" : "IJK", price: NumberDecimal("160"), "sizes": "M" },

  { "_id" : 4, "item" : "LMN" , price: NumberDecimal("10") },

  { "_id" : 5, "item" : "XYZ", price: NumberDecimal("5.75"), "sizes" : null }

])

示例:

下烂指面的$unwind操作是等效的,并为size字段中的每个元素返回一个文档。如果size字段没唯竖有解析为数组,但没有丢失、null或空数组,则$unwind将非数组操作数视为单个元素数组。

db.inventory2.aggregate( [ { $unwind: "$sizes" } ] )

db.inventory2.aggregate( [ { $unwind: { path: "$sizes" } } ] )

结果:

{ "_id" : 1, "item" : "ABC", "price" : NumberDecimal("80"), "sizes" : "S" }

{ "_id" : 1, "item" : "ABC", "price" : NumberDecimal("80"), "sizes" : "M" }

{ "_id" : 1, "item" : "ABC", "price" : NumberDecimal("80"), "sizes" : "L" }

{ "_id" : 3, "item" : "IJK", "price" : NumberDecimal("160"), "sizes" : "M" }

示例:下面的$unwind操作使用includeArrayIndex选项在输出中包含数组索引。

db.inventory2.aggregate( [

  {

    $unwind:

      {

        path: "$sizes",

         includeArrayIndex : "arrayIndex"

      }

   }])

结果:

{ "_id" : 1, "item" : "ABC", "price" : NumberDecimal("80"), "sizes" : "S", " arrayIndex " : NumberLong(0) }

{ "_id" : 1, "item" : "ABC", "price" : NumberDecimal("80"), "sizes" : "M", " arrayIndex " : NumberLong(1) }

{ "_id" : 1, "item" : "ABC", "price" : NumberDecimal("80"), "sizes" : "L", " arrayIndex " : NumberLong(2) }

{ "_id" : 3, "item" : "IJK", "price" : NumberDecimal("160"), "sizes" : "M", " arrayIndex " : null }

示例:下面的$unwind操作使用preserveNullAndEmptyArrays选项来包含size字段为null、缺失或空数组的文档。

db.inventory2.aggregate( [

   { $unwind: { path: "$sizes", preserveNullAndEmptyArrays: true } }

] )

{ "_id" : 1, "item" : "ABC", "price" : NumberDecimal("80"), "sizes" : "S" }

{ "_id" : 1, "item" : "ABC", "price" : NumberDecimal("80"), "sizes" : "M" }

{ "_id" : 1, "item" : "ABC", "price" : NumberDecimal("80"), "sizes" : "L" }

{ "_id" : 2, "item" : "EFG", "price" : NumberDecimal("120") }

{ "_id" : 3, "item" : "IJK", "price" : NumberDecimal("160"), "sizes" : "M" }

{ "_id" : 4, "item" : "LMN", "price" : NumberDecimal("10") }

{ "_id" : 5, "item" : "XYZ", "price" : NumberDecimal("5.75"), "sizes" : null }

初始化数据:

db.inventory2.insertMany([

  { "_id" : 1, "item" : "ABC", price: NumberDecimal("80"), "sizes": [ "S", "M", "L"] },

  { "_id" : 2, "item" : "EFG", price: NumberDecimal("120"), "sizes" : [ ] },

  { "_id" : 3, "item" : "IJK", price: NumberDecimal("160"), "sizes": "M" },

  { "_id" : 4, "item" : "LMN" , price: NumberDecimal("10") },

  { "_id" : 5, "item" : "XYZ", price: NumberDecimal("5.75"), "sizes" : null }

])

示例:下面的管道将展开大小数组,并将产生的文档按展开后的大小值进行分组:

db.inventory2.aggregate( [

   // First Stage

   {

     $unwind: { path: "$sizes", preserveNullAndEmptyArrays: true }

   },

   // Second Stage

   {

     $group:

       {

         _id: "$sizes",

         averagePrice: { $avg: "$price" }

       }

   },

   // Third Stage

   {

     $sort: { "averagePrice": -1 }

   }

] )

结果:

{ "_id" : "M", "averagePrice" : NumberDecimal("120") }

{ "_id" : "L", "averagePrice" : NumberDecimal("80") }

{ "_id" : "S", "averagePrice" : NumberDecimal("80") }

{ "_id" : null, "averagePrice" : NumberDecimal("45.25") }

初始化数据:

db.sales.insertMany([

  {

    _id: "1",

    "items" : [

     {

      "name" : "pens",

      "tags" : [ "writing", "office", "school", "stationary" ],

      "price" : NumberDecimal("12.00"),

      "quantity" : NumberInt("5")

     },

     {

      "name" : "envelopes",

      "tags" : [ "stationary", "office" ],

      "price" : NumberDecimal("1.95"),

      "quantity" : NumberInt("8")

     }

    ]

  },

  {

    _id: "2",

    "items" : [

     {

      "name" : "laptop",

      "tags" : [ "office", "electronics" ],

      "price" : NumberDecimal("800.00"),

      "quantity" : NumberInt("1")

     },

     {

      "name" : "notepad",

      "tags" : [ "stationary", "school" ],

      "price" : NumberDecimal("14.95"),

      "quantity" : NumberInt("3")

     }

    ]

  }

])

示例:下面的操作将按标签销售的商品分组,并计算每个标签的总销售额。

db.sales.aggregate([

  // First Stage

  { $unwind: "$items" },

  // Second Stage

  { $unwind: "$items.tags" },

  // Third Stage

  {

    $group:

      {

        _id: "$items.tags",

        totalSalesAmount:

          {

            $sum: { $multiply: [ "$items.price", "$items.quantity" ] }

          }

      }

  }

])

结果:

{ "_id" : "writing", "totalSalesAmount" : NumberDecimal("60.00") }

{ "_id" : "stationary", "totalSalesAmount" : NumberDecimal("264.45") }

{ "_id" : "electronics", "totalSalesAmount" : NumberDecimal("800.00") }

{ "_id" : "school", "totalSalesAmount" : NumberDecimal("104.85") }

    { "_id" : "office", "totalSalesAmount" : NumberDecimal("1019.60") }

Mongodb Aggregation group()分组操作

Mongo的分组操作有两种方式: aggregate({$group:{}}) 和 group()

{ $group: { _id: expression, field1: { accumulator1 : expression1 }, ... } }

为必选字段,为被分组字段,可为空或null

为可选字段,其中可包含一下运算符:

1.仅分组,对issue_xjtf表中sp1,sp2进行分组

相当于sql

db.collection.group({ key, reduce, initial [, keyf] [, cond] [, finalize] })

前三个是必备参数,“[]”中是可选参数

可以放用来和态分组的字段,并且会返回其中字段(group by 后面的字段)

是在分组操作期间对文档进行操作的聚合函数。可以返回总和或计数。该函数有两个参数:当前文档;该组的聚合结果文档。

对结果中文档,字段进行初始化

对数据筛选的滑毁条件,相当于where

1. count :取xbgi表中,article_pubdate值大于2000-01-01的数据,并分组计唤让源数

2. max :取sjwd表中,ric_publication_coden为9529a8f7-3eef-431a-a0cd-e49d601417df,用article_year分组计数,取其最晚日期。

3. sum :在表total_journal_issue中以journal_id分组,并获取article_count总数

用Navicat 执行group()时,分组值超过20000,会报如下错误(未检测具体原因):

[img]

MongoDB Aggregation

对数据进行聚合操作,然后将计算之后的数据返回。聚合操作将多个文档的值组合在依赖,并且可以对分组数据执行各种操作返回单个结果。

MongoDB提供三种方式来执行聚合操作:aggregation pipeline、map-reduce function、single purpose aggregation methods。

MongoDB 聚合操作是在数据处理管道的逻辑上建模的。documents可以进入一个用于处理docuemnt然后返回聚合值的多阶段管道。

底层的管道提供了filters(类似于查询的操作)和document transformations(修改document的输出形式)操作。

其他管道操作为document指定具体的属性或者多个属性进行分组和排序,以及用array内容的聚合工具一样。管道的阶段可以使用运算符执行任务。

管道使用MongoDB自带的本地操作来执行聚合操作更高效,管道是MongoDB执行聚合操作的首先。

聚合管道可以操作分片collection。聚合管道可以通过使用索引来提高性能。聚合管道内部会进行优化阶段。

可以使用db.collection.aggregate()的explain参数看到执行计划。

聚合管道来决定需要返回的字段。如果使用只需要的字段,这样可以减少数据量。

addFields + match放入到 addFields之前(如果是 project / $addFields的结果,就不能移动),减少数据量。

match: 先执行$match来减少数据量,然后在执行排序操作。

match: 如果在前面添加$match操作,可以使用索引来减少数据操作。

skip(在3.2开始可以使用):将 project操作之前,可以减少数据量。

通常情况下,在重新排序优化之后才会发生阶段合并。

limit:如果不能减少数据量,不会将这两个阶段合并。否则先进行排序,然后获取指定的数量,放入内存。如果在中间含有$skip操作,将其放入最后。

在数据量超过内存限制,这个操作需要设置 allowDiskUse=true。

从MongoDB3.6开始,删除了aggregate的选项,将结果作为一条数据的返回。

aggregate可以返回cursor或者数据结果集。在返回的结果中,每个document的大小不能超过16M(这个限制只针对返回的document)。

documents有可能会超过这个限制,db.collection.aggregate()默认返回cursor。

从MongoDB2.6开始,管道阶段的RAM限制为100M。如果超过限制,出错。如果为了处理大量的数据集,使用allowDiskUse选项开启管纤耐道阶段的聚合操作将数据写入到临时文件。

从MongoDB3.4之后, graphLookup操作会忽略这个选项。如果其他阶段有aggregate()操作,allowDiskUse=true将会影响这些阶段。

从MongoDB3.2开始,如果按照分片来匹配值,只会在这个分片内进行计算。

聚合操作在多个分片上执行操作,如果没有指定主分片,这些操作会被路由到其他分片上,来减少主分片的负载。

lookup阶段需要在主分片上执行查询。

将聚合管道拆分为顷祥两部分,这是为毁乎春了在分片上执行优化。

操作可以 参考实例

MapReduce可以在分片上执行操作,分片集合可以作为输入或者输出。

使用分片集合作为MapReduce输入源,mongos将作业并行派发到各个分片。mongos会等待所有的作业完成。

如果MapReduce的out字段有分片值,MongoDB使用_id字段作为分片的依据。

作为一个分片集合输出:

在操作的过程中,mapreduce有很多锁:

相关 练习教程

关于mongodbaggregate和mongodb aggregate sort的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

相关阅读

  • 数据存储(数据存储华为数据存储)

    数据存储(数据存储华为数据存储)

    数据存储在IT技术中扮演着非常重要的角色,它指的是将数据保存在计算机或服务器的存储设备中,以便日后进行访问和处理。数据存储是计算机系统中的一个基本组成部分,对于企业和个人用户来说都是至关重要的。在本文中,我们将深入探讨数据存储的重要性、常见...

    2024.04.12 18:00:34作者:intanet.cnTags:数据存储
  • 包含awsredis的词条

    包含awsredis的词条

    AWS Redis是一种云端的Redis管理服务,能够提供高性能的内存数据库,用来加速应用程序、增加应用程序缓存、实现消息传递、实现任务队列等功能。AWS Redis可以帮助开发者更轻松地构建可靠、高性能的应用程序。# 什么是AWS Red...

    2024.04.12 16:22:18作者:intanet.cnTags:awsredis
  • mongodb怎么读(mongodb中文)

    mongodb怎么读(mongodb中文)

    MongoDB是一种流行的NoSQL数据库管理系统,它使用文档存储结构,为开发人员提供了灵活性和性能。本文将介绍如何读取MongoDB中的数据。# 连接到MongoDB数据库首先,我们需要连接到MongoDB数据库。可以使用MongoDB官...

    2024.04.12 16:11:11作者:intanet.cnTags:mongodb怎么读
  • 关于redishdel的信息

    关于redishdel的信息

    简介:Redishdel是一种IT技术工具,被广泛应用于数据存储和缓存管理领域。它以高效的内存数据库系统著称,通过使用快速的数据结构和灵活的命令功能,帮助用户提升数据处理效率和性能。多级标题:1. Redishdel的特点2. Redish...

    2024.04.12 16:00:42作者:intanet.cnTags:redishdel
  • mysqlupdate(MySQL update set)

    mysqlupdate(MySQL update set)

    简介:MySQL是一种广泛使用的开源关系型数据库管理系统,用来管理和存储数据。在数据库操作中,数据库的更新是很常见的操作之一。而MySQL提供了多种更新数据的方法,其中包括使用UPDATE语句进行数据更新操作。本文将介绍MySQL更新数据的...

    2024.04.12 09:55:26作者:intanet.cnTags:mysqlupdate
  • mysql服务(mysql服务怎么删除)

    mysql服务(mysql服务怎么删除)

    **简介:**MySQL是一种关系型数据库管理系统,广泛应用于互联网应用和大型企业级系统中。它是开源软件,具有稳定性高、性能优异、功能强大等特点,被广泛应用于各种企业级系统的数据存储和管理中。**多级标题:**一、MySQL服务的架构二、M...

    2024.04.12 02:22:25作者:intanet.cnTags:mysql服务
  • 分布式系统架构(分布式的架构)

    分布式系统架构(分布式的架构)

    分布式系统架构简介:随着IT技术的不断发展,分布式系统架构在当今互联网行业中变得越来越重要。分布式系统架构是将系统的各个部分分散在不同的计算机或服务器上,这样可以提高系统的可靠性、可扩展性和性能。本文将详细说明分布式系统架构的定义、特点和应...

    2024.04.11 18:33:28作者:intanet.cnTags:分布式系统架构
  • oracle8.1.7下载(oracle最新版本下载)

    oracle8.1.7下载(oracle最新版本下载)

    标题:Oracle 8.1.7下载简介:Oracle 8.1.7是一款被广泛使用的数据库管理系统软件,它具有稳定性高、性能优异、功能强大等特点。许多企业和开发者都选择使用Oracle 8.1.7来管理他们的数据库。在本文中,将介绍如何下载O...

    2024.04.11 18:22:14作者:intanet.cnTags:oracle8.1.7下载