On this page本页内容
New in version 5.1.在版本5.1中新增。
Returns the incrementing ordinal from a timestamp as a 以long.long形式返回时间戳中递增的序号。
When multiple events happen within the same second, the incrementing ordinal uniquely identifies each event.当多个事件在同一秒内发生时,递增序号唯一标识每个事件。
$tsIncrement syntax:语法
{ $tsIncrement: <expression> }
The expression must resolve to a timestamp.表达式必须解析为timestamp。
$tsIncrement returns:返回:
Null if the input expression evaluates to null or refers to a field that is missing.Null或引用缺少的字段,则为Null。timestamp,则为错误。Create a 创建包含公司股票金融市场销售额的stockSales collection that contains company stock financial market sales:stockSales集合:
db.stockSales.insertMany( [
{ _id: 0, symbol: "ABC", saleTimestamp: Timestamp(1622731060, 1) },
{ _id: 1, symbol: "ABC", saleTimestamp: Timestamp(1622731060, 2) },
{ _id: 2, symbol: "DEF", saleTimestamp: Timestamp(1714124193, 1) },
{ _id: 3, symbol: "DEF", saleTimestamp: Timestamp(1714124193, 2) },
{ _id: 4, symbol: "DEF", saleTimestamp: Timestamp(1714124193, 3) }
] )
In the timestamp constructor, the:在timestamp构造函数中
The following example uses 以下示例在$tsIncrement in a $project stage to return the incrementing ordinal from the stock sales saleTimestamp field:$project阶段中使用$tsIncrement从股票销售时间戳saleTimestamp字段返回递增序号:
db.stockSales.aggregate( [
{
$project:
{
_id: 0, saleTimestamp: 1, saleIncrement: { $tsIncrement: "$saleTimestamp" }
}
}
] )
In the example, 在本例中,$project only includes the saleTimestamp and saleIncrement fields as shown in the following output:$project仅包含saleTimestamp和saleIncrement字段,如以下输出所示:
{
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")
}
$tsIncrement in a Change Stream Cursor to Monitor Collection Changes$tsIncrement监视集合更改The example in this section uses 本节中的示例在更改流游标中使用$tsIncrement in a change stream cursor to return every other change made to a collection in the same second of time.$tsIncrement来返回在同一时间内对集合所做的所有其他更改。
Create a change stream cursor on a collection named 在一个名为cakeSales that you will see later in this section:cakeSales的集合上创建一个变更流游标,您将在本节后面看到:
cakeSalesCursor = db.cakeSales.watch( [
{
$match: {
$expr: {
$eq: [
{ $mod: [ { $tsIncrement: "$clusterTime" } , 2 ] },
0
]
}
}
}
] )
In the example, the:在该示例中:
db.collection.watch()cakeSales collection and stores the cursor in cakeSalesCursor.cakeSales集合创建更改流游标,并将游标存储在cakeSalesCursor中。$match$expr operator.$expr运算符返回的文档。$expr operator:运算符:
Applies 将$mod 2 to the $clusterTime variable's incrementing ordinal returned by $tsIncrement.$mod 2应用于$tsIncrement返回的$clusterTime变量的递增序号。
$clusterTime is the timestamp from the oplog entry when the 是修改cakeSales collection is modified. cakeSales集合时oplog条目的时间戳。See Command Response.请参阅命令响应。
$mod to 0 using $eq.$eq将$mod返回的值与0进行比较。Create a 创建包含加利福尼亚州(cakeSales collection that contains cake sales in the states of California (CA) and Washington (WA):CA)和华盛顿州(WA)蛋糕销售的cakeSales集合:
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 }
] )
To monitor the 要监视cakeSales collection changes, use cakeSalesCursor. cakeSales集合更改,请使用cakeSalesCursor。For example, to obtain the next document from 例如,要从cakeSalesCursor, use the next() method:cakeSalesCursor获取下一个文档,请使用next()方法:
cakeSalesCursor.next()
Depending on the second when the documents were added to 根据文档添加到cakeSales, the output from cakeSalesCursor.next() varies. cakeSales的秒数,cakeSalesCursor.next()的输出会有所不同。For example, the document additions might span more than one second.例如,文档添加可能会持续一秒钟以上。
The following 以下cakeSalesCursor.next() example output shows the insert details for the first document added to the cakeSales collection. cakeSalesCursor.next()示例输出显示了添加到cakeSales集合的第一个文档的insert详细信息。Notice the incrementing ordinal 请注意,i is 2 in the clusterTime field.clusterTime字段中递增序号i为2。
_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 }
Running 再次运行cakeSalesCursor.next() again returns the cakeSales document for which the clusterTime incrementing ordinal i is 4, omitting the document where i is 3.cakeSalesCursor.next()将返回clusterTime递增序号i为4的cakeSales文档,忽略i为3的文档。