Definición
Nuevo en la versión 5.1.
Devuelve el ordinal incremental de un timestamp como un long.
Cuando varios eventos ocurren en el mismo segundo, el ordinal incremental identifica de forma única cada evento.
$tsIncrement sintaxis:
{ $tsIncrement: <expression> }
La expresión debe resolverse en una marca de tiempo.
Comportamiento
$tsIncrement Devuelve:
Nullsi la expresión de entrada evalúa anullo hace referencia a un campo que falta.Un error si la expresión de entrada no evalúa una marca de tiempo.
Ejemplos
Obtener el consecutivo incremental de un campo de marca de tiempo
Cree una colección stockSales que contenga las ventas del mercado financiero de acciones de la empresa:
db.stockSales.insertMany( [ { _id: 0, symbol: "MDB", saleTimestamp: Timestamp(1622731060, 1) }, { _id: 1, symbol: "MDB", saleTimestamp: Timestamp(1622731060, 2) }, { _id: 2, symbol: "MSFT", saleTimestamp: Timestamp(1714124193, 1) }, { _id: 3, symbol: "MSFT", saleTimestamp: Timestamp(1714124193, 2) }, { _id: 4, symbol: "MSFT", saleTimestamp: Timestamp(1714124193, 3) } ] )
En el constructor de marca de tiempo, el:
El primer valor es el número de segundos después de la Unix epoch.
El segundo valor es el ordinal creciente. Cuando ocurren varios eventos en el mismo segundo, el ordinal creciente identifica de forma única cada evento.
El siguiente ejemplo utiliza $tsIncrement en una etapa para devolver el ordinal incremental $project del saleTimestamp campo de ventas de stock:
db.stockSales.aggregate( [ { $project: { _id: 0, saleTimestamp: 1, saleIncrement: { $tsIncrement: "$saleTimestamp" } } } ] )
En el ejemplo, $project solo incluye los campos saleTimestamp y saleIncrement como se muestra en la siguiente salida:
{ saleTimestamp: Timestamp({ t: 1622731060, i: 1 }), saleIncrement: Long("1") }, { saleTimestamp: Timestamp({ t: 1622731060, i: 2 }), saleIncrement: Long("2") }, { saleTimestamp: Timestamp({ t: 1714124193, i: 1 }), saleIncrement: Long("1") }, { saleTimestamp: Timestamp({ t: 1714124193, i: 2 }), saleIncrement: Long("2") }, { saleTimestamp: Timestamp({ t: 1714124193, i: 3 }), saleIncrement: Long("3") }
Usa $tsIncrement en un cursor de Change Stream para supervisar los Cambios en la colección
El ejemplo de esta sección utiliza $tsIncrement en un cursor de flujo de cambios para devolver cada segundo cambio realizado en una colección en el mismo segundo de tiempo.
Cree un cursor de flujo de cambios en una colección llamada cakeSales que verá más adelante en esta sección:
cakeSalesCursor = db.cakeSales.watch( [ { $match: { $expr: { $eq: [ { $mod: [ { $tsIncrement: "$clusterTime" } , 2 ] }, 0 ] } } } ] )
En el ejemplo, el:
El
db.collection.watch()crea un cursor de flujo de cambios para lacakeSalescolección y almacena el cursor encakeSalesCursor.La
$matchetapa filtra los documentos a aquellos devueltos por el operador$expr.$exproperador:Aplica
$mod2al ordinal incrementado de la variable$clusterTimedevuelto por$tsIncrement.$clusterTimees la marca de tiempo de la entrada de oplog cuando se modifica la coleccióncakeSales. Consulte Respuesta del Comando.
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 } ] )
Para supervisar los cakeSales cambios de la colección,cakeSalesCursor utilice. Por ejemplo, para obtener el siguiente documento cakeSalesCursor de, utilice el next() método:
cakeSalesCursor.next()
Dependiendo del segundo en el que se agregaron los documentos a cakeSales, la salida de cakeSalesCursor.next() varía. Por ejemplo, la adición de documentos podría abarcar más de un segundo.
La siguiente salida de ejemplo cakeSalesCursor.next() muestra los insert detalles del primer documento añadido a la colección cakeSales. Observa que el ordinal incremental i es 2 en el campo clusterTime.
_id: { _data: '82613A4F25000000022B022C0100296E5A100454C5BFAF538C47AB950614F43889BE00461E5F696400290004' }, operationType: 'insert', clusterTime: Timestamp({ t: 1631211301, i: 2 }), fullDocument: { _id: 0, type: 'chocolate', orderDate: ISODate("2020-05-18T14:10:30.000Z"), state: 'CA', price: 13, quantity: 120 }, ns: { db: 'test', coll: 'cakeSales' }, documentKey: { _id: 0 }
Ejecutar cakeSalesCursor.next() nuevamente devuelve el documento cakeSales para el cual el número ordinal incremental clusterTime i es 4, omitiendo el documento donde i es 3.