$tsIncrement (agregação)
Nesta página
Definição
Novidades na versão 5.1.
Retorna o ordinal incrementado de um carimbo dedata/hora como long
.
Quando vários eventos acontecem no mesmo segundo, o ordinal incrementado identifica exclusivamente cada evento.
$tsIncrement
sintaxe:
{ $tsIncrement: <expression> }
A expressão deve ser resolvida para um registro de data e hora.
Comportamento
$tsIncrement
Devoluções:
Null
se a expressão de entrada avaliar paranull
ou se referir a um campo ausente.Um erro se a expressão de entrada não for avaliada como um carimbo de data/hora.
Exemplos
Obter o ordinal incrementado a partir de um campo de registro de data e hora
Crie uma collection stockSales
que contenha vendas do mercado financeiro de ações da 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) } ] )
No construtor de registro de data e hora , o:
O primeiro valor é o número de segundos após a Unix epoch.
O segundo valor é o ordinal incrementado. Quando vários eventos acontecem no mesmo segundo, o ordinal incrementado identifica exclusivamente cada evento.
O exemplo a seguir usa $tsIncrement
em um estágio $project
para retornar o ordinal incrementado do campo de vendas de ações saleTimestamp
:
db.stockSales.aggregate( [ { $project: { _id: 0, saleTimestamp: 1, saleIncrement: { $tsIncrement: "$saleTimestamp" } } } ] )
No exemplo, $project
inclui apenas os campos saleTimestamp
e saleIncrement
como mostrado na seguinte saída:
{ 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") }
Use $tsIncrement
em um cursor de fluxo de alterações para monitorar alterações de coleção
O exemplo desta seção usa $tsIncrement
em um cursor de fluxo de alterações para retornar todas as outras alterações feitas em uma coleção no mesmo segundo de tempo.
Crie um cursor de fluxo de alterações em uma coleção chamada cakeSales
que você verá mais adiante nesta seção:
cakeSalesCursor = db.cakeSales.watch( [ { $match: { $expr: { $eq: [ { $mod: [ { $tsIncrement: "$clusterTime" } , 2 ] }, 0 ] } } } ] )
No exemplo, o:
O método
db.collection.watch()
cria um cursor de fluxo de alterações para a coleçãocakeSales
e armazena o cursor emcakeSalesCursor
.O estágio
$match
filtra os documentos para aqueles retornados pelo operador$expr
.$expr
operador:Aplica
$mod
2
ao ordinal de incremento da variável$clusterTime
retornado por$tsIncrement
.$clusterTime
é o carimbo de data/hora da entrada do oplog quando a collectioncakeSales
é modificada. Consulte Resposta do comando.
Crie uma collection cakeSales
que contenha vendas de bolo nos estados da Califórnia (CA
) e de 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 monitorar as alterações da coleção cakeSales
, utilize cakeSalesCursor
. Por exemplo, para obter o próximo documento de cakeSalesCursor
, utilize o método next()
:
cakeSalesCursor.next()
Dependendo do segundo em que os documentos foram adicionados ao cakeSales
, a saída de cakeSalesCursor.next()
varia. Por exemplo, as adições de documentos podem abranger mais de um segundo.
O exemplo de saída cakeSalesCursor.next()
a seguir mostra os detalhes insert
do primeiro documento adicionado à collection cakeSales
. Observe que o ordinal incrementado i
é 2
no 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 }
Executar cakeSalesCursor.next()
novamente retorna o documento cakeSales
para o qual o clusterTime
ordinal incrementado i
é 4
, omitindo o documento onde i
é 3
.