Definición
Nuevo en la versión 5.1.
Devuelve el ordinal incremental de un marca de tiempo como.long
Cuando ocurren varios eventos dentro del 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 devoluciones:
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 primer valor es el número de segundos después de la época de Unix.
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, solo incluye$project los saleTimestamp saleIncrement campos y 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") }
Utilice $tsIncrement en un cursor de flujo de cambios para supervisar los cambios de la colección
El ejemplo de esta sección utiliza $tsIncrement en un cursor de flujo de cambio para devolver todos los demás cambios realizados en una colección en el mismo segundo de tiempo.
Crea un cursor de flujo de cambios en una colección llamada cakeSales que verás más adelante en esta sección:
cakeSalesCursor = db.cakeSales.watch( [ { $match: { $expr: { $eq: [ { $mod: [ { $tsIncrement: "$clusterTime" } , 2 ] }, 0 ] } } } ] )
En el ejemplo, el:
db.collection.watch()El método crea un cursor de flujo de cambio para lacakeSalescolección y almacena el cursorcakeSalesCursoren.$matchLa$expretapa filtra los documentos a aquellos devueltos por el operador.$exproperador:Aplica
$mod2al$clusterTimeordinal incremental de la variable$tsIncrementdevuelto por.$clusterTimeEs la marca de tiempo de la entrada delcakeSalesregistro de operaciones cuando se modifica la colección.Consulte la respuesta del comando.Compara el valor devuelto
$modde0$eqcon utilizando.
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 }
Al ejecutar cakeSalesCursor.next() nuevamente, se devuelve el documento cakeSales para el cual el ordinal incremental i de clusterTime es 4, omitiendo el documento donde i es 3.