Definición
Nuevo en la versión 5.0.
Devuelve el valor de una expresión aplicada a un documento en una posición especificada relativa al documento actual en la partición de la etapa de $setWindowFields .
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 $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 Por ejemplo:
| |
Especifica una expresión por defecto opcional para evaluar si la posición del documento está fuera de la La expresión predeterminada debe evaluarse a un valor constante. Si no especifica una expresión predeterminada, |
Comportamiento
$shift devuelve un error si especifica una ventana en la $setWindowFields etapa.
Ejemplos
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.
Desplazar usando un entero positivo
Este ejemplo utiliza $shift en la etapa para generar $setWindowFields el quantity de las ventas de pasteles de cada documento que sigue 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 enstate. Existen particiones paraCAyWA.sortBy: { quantity: -1 }ordena los documentos en cada partición porquantityen orden descendente (-1), de modo que elquantitymás alto sea primero.
outputdespués desortBy:Establece el campo
shiftQuantityForStateal valorquantityde los documentos en cadastate.Utiliza para devolver
$shiftelquantityvalor del documento que sigue al documento actual en la salida.
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" }
Desplazamiento utilizando un entero negativo
Este ejemplo utiliza $shift en la etapa para generar $setWindowFields el quantity de las ventas de pasteles de cada documento anterior 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 enstate. Existen particiones paraCAyWA.sortBy: { quantity: -1 }ordena los documentos en cada partición porquantityen orden descendente (-1), de modo que elquantitymás alto sea primero.
outputdespués desortBy:Establece el campo
shiftQuantityForStateal valorquantityde los documentos en cadastate.Utiliza para devolver
$shiftelquantityvalor del documento anterior al documento actual en la salida.
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 }