Definición
Nuevo en la versión 5.0.
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 Por ejemplo:
| |
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 La expresión predeterminada debe evaluarse como 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.
Desplazamiento utilizando un entero positivo
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 enstate. Existen particiones paraCAyWA.sortBy: { quantity: -1 }ordena los documentos en cada partición porquantityen orden descendente-1(), por lo que el más altoquantityes el primero.
outputdespués desortBy:Establece el campo
shiftQuantityForStateen el 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 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" }
Desplazamiento utilizando un entero negativo
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 enstate. Existen particiones paraCAyWA.sortBy: { quantity: -1 }ordena los documentos en cada partición porquantityen orden descendente-1(), por lo que el más altoquantityes el primero.
outputdespués desortBy:Establece el campo
shiftQuantityForStateen el 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 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 }