Docs Menu
Docs Home
/ /
Operadores de tuberías de agregación

$shift (agregación)

Nuevo en la versión 5.0.

$shift

Devuelve el valor de un expresión aplicada a un documento en una posición especificada con respecto al documento actual en la partición $setWindowFields de la etapa.

El valor del campo $setWindowFields sortBy de la etapa determina el orden del documento. Para más información sobre cómo MongoDB compara campos de diferentes tipos, consulte Orden de comparación BSON.

$shift solo está disponible en la $setWindowFields etapa.

$shift sintaxis:

{
$shift: {
output: <output expression>,
by: <integer>,
default: <default expression>
}
}

$shift toma un documento con estos campos:

Campo
Descripción

Especifica una expresión para evaluarla y devolverla en la salida.

Especifica un integer con una posición de documento numérica relativa al documento actual en la salida.

Por ejemplo:

  • 1 especifica la posición del documento después del documento actual.

  • -1 especifica la posición del documento antes del documento actual.

  • -2 especifica la posición del documento que está dos posiciones antes del documento actual.

Especifica una expresión predeterminada opcional para evaluar si la posición del documento está fuera de la ventana implícita de la etapa. Esta $setWindowFields ventana implícita contiene todos los documentos de la partición.

La expresión predeterminada debe evaluarse como un valor constante.

Si no especifica una expresión predeterminada, $shift devuelve null para los documentos cuyas posiciones están fuera de la $setWindowFields ventana de etapa implícita.

$shift devuelve un error si especifica una ventana en la $setWindowFields etapa.

Crea una colección de cakeSales que incluya ventas de pasteles en el estado de California (CA) y Washington (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 }
] )

La colección cakeSales se utiliza en los siguientes ejemplos.

Este ejemplo utiliza $shift en la etapa para generar $setWindowFields las quantity de las ventas de pasteles de cada documento siguiente al documento actual para state cada:

db.cakeSales.aggregate( [
{
$setWindowFields: {
partitionBy: "$state",
sortBy: { quantity: -1 },
output: {
shiftQuantityForState: {
$shift: {
output: "$quantity",
by: 1,
default: "Not available"
}
}
}
}
}
] )

En el ejemplo:

  • partitionBy: "$state" particiona los documentos de la colección en state. Existen particiones para CA y WA.

  • sortBy: { quantity: -1 } ordena los documentos en cada partición por quantity en orden descendente-1 (), por lo que el más alto quantity es el primero.

  • output después de sortBy:

    • Establece el campo shiftQuantityForState en el valor quantity de los documentos en cada state.

    • Utiliza para devolver $shift el quantity valor del documento que sigue al documento actual en la salida.

      • La posición del documento se especifica utilizando $shift por integer establecido 1 en.

      • Para los documentos fuera de la ventana $shift implícita,"Not available" devuelve, que se especifica mediante la expresión predeterminada.

En este ejemplo de salida, el valor desplazado quantity se muestra en el campo shiftQuantityForState para cada documento devuelto:

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

Este ejemplo utiliza $shift en la etapa para generar $setWindowFields las quantity de las ventas de pasteles de cada documento antes del documento actual para state cada:

db.cakeSales.aggregate( [
{
$setWindowFields: {
partitionBy: "$state",
sortBy: { quantity: -1 },
output: {
shiftQuantityForState: {
$shift: {
output: "$quantity",
by: -1,
default: "Not available"
}
}
}
}
}
] )

En el ejemplo:

  • partitionBy: "$state" particiona los documentos de la colección en state. Existen particiones para CA y WA.

  • sortBy: { quantity: -1 } ordena los documentos en cada partición por quantity en orden descendente-1 (), por lo que el más alto quantity es el primero.

  • output después de sortBy:

    • Establece el campo shiftQuantityForState en el valor quantity de los documentos en cada state.

    • Utiliza para devolver $shift el quantity valor del documento anterior al documento actual en la salida.

      • La posición del documento se especifica utilizando $shift por integer establecido -1 en.

      • Para los documentos fuera de la ventana $shift implícita,"Not available" devuelve, que se especifica mediante la expresión predeterminada.

En este ejemplo de salida, el valor desplazado quantity se muestra en el campo shiftQuantityForState para cada documento devuelto:

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

Volver

$setUnion

En esta página