Docs HomeMongoDB Manual

$push (aggregation)

On this page本页内容

Definition定义

$push

$push returns an array of all values that result from applying an expression to documents.返回将表达式应用于文档所产生的所有值的数组。

$push is available in these stages:$push在以下阶段可用:

Syntax语法

$push syntax:语法:

{ $push: <expression> }

For more information on expressions, see Expressions.有关表达式的详细信息,请参阅表达式

Examples实例

Use in $group Stage$group阶段中使用

Consider a sales collection with the following documents:考虑一个包含以下文档的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") }

Grouping the documents by the day and the year of the date field, the following operation uses the $push accumulator to compute the list of items and quantities sold for each group:根据date字段的日期和年份对文档进行分组,以下操作使用$push累加器来计算每组的商品和销售数量列表:

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

The operation returns the following results:该操作返回以下结果:

{
"_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 } ]
}

Use in $setWindowFields Stage$setWindowFields阶段中使用

New in version 5.0. 5.0版新增。

Create a cakeSales collection that contains cake sales in the states of California (CA) and Washington (WA):创建一个包含加利福尼亚州(CA)和华盛顿州(WA)蛋糕销售的cakeSales系列:

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 }
] )

This example uses $push in the $setWindowFields stage to output an array of cake sales quantity values for each state:此示例使用$setWindowFields阶段中的$push为每个state输出蛋糕销售quantity值的数组:

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

In the example:在示例中:

  • partitionBy: "$state" partitions the documents in the collection by state. There are partitions for CA and WA.state对集合中的文档进行分区CAWA有分区。
  • sortBy: { orderDate: 1 } sorts the documents in each partition by orderDate in ascending order (1), so the earliest orderDate is first.orderDate按升序(1)对每个分区中的文档进行排序,因此最早的orderDate是第一个。
  • output sets the array of quantity values using $push for the documents in a documents window.使用$pushdocuments窗口中的文档设置quantity值数组。

    The window contains documents between an unbounded lower limit and the current document in the output. 窗口包含在unbounded下限和输出中的current文档之间的文档。This means $push appends the quantity values to the quantitiesForState array for the documents between the beginning of the partition and the current document.这意味着$pushquantity值附加到分区开始和当前文档之间文档的quantitiesForState数组中。

In this output, the array of quantity values for CA and WA is shown in the quantitiesForState array:在该输出中,CAWAquantity值数组显示在quantitiesForState数组中:

{ "_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 ] }