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 $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.
Desplazar usando 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
shiftQuantityForStateal valorquantityde los documentos en cadastate.Utiliza para devolver
$shiftelquantityvalor del documento que sigue al documento actual en la salida.La posición del documento se especifica utilizando
$shiftporintegerestablecido1en.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 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
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 utilizando
$shiftporintegerestablecido-1en.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 }