Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /
Operadores de pipeline 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 relativa al documento actual en la etapa $setWindowFields partición.

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

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

$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 numérica del documento 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 por defecto opcional para evaluar si la posición del documento está fuera de la $setWindowFields etapa ventana implícita. La ventana implícita contiene todos los documentos en la particao.

La expresión por defecto debe evaluarse como un valor constante.

Si no se especifica una expresión por defecto, $shift devuelve null para los documentos cuyas posiciones se encuentran fuera de la ventana de etapa implícita de $setWindowFields.

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

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 $setWindowFields para obtener el quantity de las ventas de pasteles de cada documento posterior al documento actual para cada state:

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), de modo que el quantity más alto sea primero.

  • output después de sortBy:

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

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

      • La posición del documento se especifica usando $shift por integer ajustado a 1.

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

En este ejemplo de salida, el valor desplazado de quantity se muestra en el campo shiftQuantityForState de 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 usa $shift en la etapa $setWindowFields para obtener la quantity de las ventas de pasteles de cada documento anterior al documento actual para cada state:

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), de modo que el quantity más alto sea primero.

  • output después de sortBy:

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

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

      • La posición del documento se especifica usando $shift por integer ajustado a -1.

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

En este ejemplo de salida, el valor desplazado de quantity se muestra en el campo shiftQuantityForState de 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