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 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 Por ejemplo:
| |
Especifica una expresión por defecto opcional para evaluar si la posición del documento está fuera de la La expresión por defecto debe evaluarse como un valor constante. Si no se especifica una expresión por defecto, |
Comportamiento
$shift devuelve un error si se especifica una ventana en la etapa $setWindowFields.
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 $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 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
$shiftpara devolver el valorquantitydel documento que sigue al documento actual en la salida.La posición del documento se especifica usando
$shiftporintegerajustado a1.Para los documentos fuera de la ventana implícita,
$shiftdevuelve"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" }
Desplazamiento utilizando un entero negativo
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 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
$shiftpara devolver el valorquantitydel documento anterior al documento actual en el resultado.La posición del documento se especifica usando
$shiftporintegerajustado a-1.Para los documentos fuera de la ventana implícita,
$shiftdevuelve"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 }