MongoDB聚合运算符:$push

MongoDB聚合运算符:$push


$push聚合运算符返回表达式应用到文档后的值产生的数组。可以应用于 $bucket$bucketAuto$group$setWindowFields等阶段。

语法

{ $push: <expression> }

$push可以用来比较任何类型的值,针对不同的类型使用特定的BSON比较顺序。

举例

sales集合有下列文档:

{ "_id" : 1, "item" : "abc", "price" : 10, "quantity" : 2, "date" : ISODate("2014-01-01T08:00:00Z") }
{ "_id" : 2, "item" : "jkl", "price" : 20, "quantity" : 1, "date" : ISODate("2014-02-03T09:00:00Z") }
{ "_id" : 3, "item" : "xyz", "price" : 5, "quantity" : 5, "date" : ISODate("2014-02-03T09:05:00Z") }
{ "_id" : 4, "item" : "abc", "price" : 10, "quantity" : 10, "date" : ISODate("2014-02-15T08:00:00Z") }
{ "_id" : 5, "item" : "xyz", "price" : 5, "quantity" : 10, "date" : ISODate("2014-02-15T09:05:00Z") }
{ "_id" : 6, "item" : "xyz", "price" : 5, "quantity" : 5, "date" : ISODate("2014-02-15T12:05:10Z") }
{ "_id" : 7, "item" : "xyz", "price" : 5, "quantity" : 10, "date" : ISODate("2014-02-15T14:12:12Z") }

下面的聚合操作根据日期字段date的日和年对文档进行分组,使用$push累加器对分组内的条目销售量进行计算:

db.sales.aggregate(
   [
   { $sort: { date: 1, item: 1 } },
   {
       $group:
         {
           _id: { day: { $dayOfYear: "$date"}, year: { $year: "$date" } },
           itemsSold: { $push:  { item: "$item", quantity: "$quantity" } }
         }
     }
   ]
)

操作返回下面的结果:

{
   "_id" : { "day" : 46, "year" : 2014 },
   "itemsSold" : [
      { "item" : "abc", "quantity" : 10 },
      { "item" : "xyz", "quantity" : 10 },
      { "item" : "xyz", "quantity" : 5 },
      { "item" : "xyz", "quantity" : 10 }
   ]
}
{
   "_id" : { "day" : 34, "year" : 2014 },
   "itemsSold" : [
      { "item" : "jkl", "quantity" : 1 },
      { "item" : "xyz", "quantity" : 5 }
   ]
}
{
   "_id" : { "day" : 1, "year" : 2014 },
   "itemsSold" : [ { "item" : "abc", "quantity" : 2 } ]
}

$setWindowFields阶段使用

使用下面的脚本创建cakeSales集合,包含了在加利福尼亚(CA)和华盛顿(WA)的蛋糕销售记录:

db.cakeSales.insertMany( [
   { _id: 0, type: "chocolate", orderDate: new Date("2020-05-18T14:10:30Z"),
     state: "CA", price: 13, quantity: 120 },
   { _id: 1, type: "chocolate", orderDate: new Date("2021-03-20T11:30:05Z"),
     state: "WA", price: 14, quantity: 140 },
   { _id: 2, type: "vanilla", orderDate: new Date("2021-01-11T06:31:15Z"),
     state: "CA", price: 12, quantity: 145 },
   { _id: 3, type: "vanilla", orderDate: new Date("2020-02-08T13:13:23Z"),
     state: "WA", price: 13, quantity: 104 },
   { _id: 4, type: "strawberry", orderDate: new Date("2019-05-18T16:09:01Z"),
     state: "CA", price: 41, quantity: 162 },
   { _id: 5, type: "strawberry", orderDate: new Date("2019-01-08T06:12:03Z"),
     state: "WA", price: 43, quantity: 134 }
] )

下面的聚合在$setWindowFields阶段使用$push输出每个州的蛋糕销售量的数组:

db.cakeSales.aggregate( [
   {
      $setWindowFields: {
         partitionBy: "$state",
         sortBy: { orderDate: 1 },
         output: {
            quantitiesForState: {
               $push: "$quantity",
               window: {
                  documents: [ "unbounded", "current" ]
               }
            }
         }
      }
   }
] )

在本例中:

  • partitionBy: "$state"根据state对集合中的文档进行分区,分为两个区CAWA
  • sortBy: { orderDate: 1 }根据orderDate对分区内的文档由小到大进行排序,最早的orderDate排在最前面。
  • output使用$push对窗口中的文档进行计算,得到销售量数组。

执行的结果如下:

{ "_id" : 4, "type" : "strawberry", "orderDate" : ISODate("2019-05-18T16:09:01Z"),
  "state" : "CA", "price" : 41, "quantity" : 162, "quantitiesForState" : [ 162 ] }
{ "_id" : 0, "type" : "chocolate", "orderDate" : ISODate("2020-05-18T14:10:30Z"),
  "state" : "CA", "price" : 13, "quantity" : 120, "quantitiesForState" : [ 162, 120 ] }
{ "_id" : 2, "type" : "vanilla", "orderDate" : ISODate("2021-01-11T06:31:15Z"),
  "state" : "CA", "price" : 12, "quantity" : 145, "quantitiesForState" : [ 162, 120, 145 ] }
{ "_id" : 5, "type" : "strawberry", "orderDate" : ISODate("2019-01-08T06:12:03Z"),
  "state" : "WA", "price" : 43, "quantity" : 134, "quantitiesForState" : [ 134 ] }
{ "_id" : 3, "type" : "vanilla", "orderDate" : ISODate("2020-02-08T13:13:23Z"),
  "state" : "WA", "price" : 13, "quantity" : 104, "quantitiesForState" : [ 134, 104 ] }
{ "_id" : 1, "type" : "chocolate", "orderDate" : ISODate("2021-03-20T11:30:05Z"),
  "state" : "WA", "price" : 14, "quantity" : 140, "quantitiesForState" : [ 134, 104, 140 ] }

相关推荐

  1. MongoDB聚合运算符:$push

    2024-04-15 02:04:04       39 阅读
  2. MongoDB聚合运算符:$add

    2024-04-15 02:04:04       55 阅读
  3. MongoDB聚合运算符:$arrayToObject

    2024-04-15 02:04:04       52 阅读
  4. MongoDB聚合运算符;$dateToParts

    2024-04-15 02:04:04       53 阅读
  5. MongoDB聚合运算符:$dayOfWeek

    2024-04-15 02:04:04       54 阅读
  6. MongoDB聚合运算符:$dayOfMonth

    2024-04-15 02:04:04       51 阅读
  7. MongoDB聚合运算符;$dateToString

    2024-04-15 02:04:04       48 阅读
  8. MongoDB聚合运算符:$dayOfYear

    2024-04-15 02:04:04       48 阅读
  9. MongoDB聚合运算符:$denseRank

    2024-04-15 02:04:04       42 阅读
  10. MongoDB聚合运算符:$dateTrunc

    2024-04-15 02:04:04       45 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-15 02:04:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-15 02:04:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-15 02:04:04       82 阅读
  4. Python语言-面向对象

    2024-04-15 02:04:04       91 阅读

热门阅读

  1. 数据库-Redis(11)

    2024-04-15 02:04:04       28 阅读
  2. [蓝桥杯 2023 国 B] 班级活动

    2024-04-15 02:04:04       41 阅读
  3. Linux系统命令三剑客awk

    2024-04-15 02:04:04       37 阅读
  4. Qt C++ 实现文件监视源码

    2024-04-15 02:04:04       29 阅读
  5. MacOS安装Homebrew教程

    2024-04-15 02:04:04       40 阅读
  6. pycharm 链接 MySQL

    2024-04-15 02:04:04       35 阅读
  7. 6. Mysql里面的GTID 全局事务标识 介绍

    2024-04-15 02:04:04       35 阅读
  8. 6.5-1Python之列表嵌套字典的使用

    2024-04-15 02:04:04       35 阅读
  9. C#面:如何使用 IFormattable 接口实现格式化输出

    2024-04-15 02:04:04       42 阅读
  10. js和ES的关系

    2024-04-15 02:04:04       44 阅读
  11. v3+antd+echarts的bug记录

    2024-04-15 02:04:04       39 阅读
  12. 【springboot开发】PO、DTO等对象的基本概念

    2024-04-15 02:04:04       40 阅读
  13. js中return的作用有什么?

    2024-04-15 02:04:04       40 阅读
  14. nodejs安装常用命令

    2024-04-15 02:04:04       47 阅读