$tsSecond (aggregation)
定义
5.1 版本中的新功能。
$tsSecond
语法:
{ $tsSecond: <expression> }
The 表达式(expression) must resolve to a timestamp.
另请参阅:
行为
$tsSecond
returns:
Null
if the input 表达式(expression) evaluates tonull
or refers to a field that is missing.An error if the input 表达式(expression) does not evaluate to a timestamp.
示例
Obtain the Number of Seconds from a Timestamp Field
Create a stockSales
collection that contains company stock financial
market sales:
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) } ] )
In the timestamp constructor, the:
First value is the number of seconds after the Unix epoch.
Second value is the incrementing ordinal. When multiple events happen within the same second, the incrementing ordinal uniquely identifies each event.
The following example uses $tsSecond
in a
$project
pipeline stage to return the seconds from the
stock sales saleTimestamp
field:
db.stockSales.aggregate( [ { $project: { _id: 0, saleTimestamp: 1, saleSeconds: { $tsSecond: "$saleTimestamp" } } } ] )
示例输出:
{ saleTimestamp: Timestamp({ t: 1622731060, i: 1 }), saleSeconds: Long("1622731060") }, { saleTimestamp: Timestamp({ t: 1622731060, i: 2 }), saleSeconds: Long("1622731060") }, { saleTimestamp: Timestamp({ t: 1714124193, i: 1 }), saleSeconds: Long("1714124193") }, { saleTimestamp: Timestamp({ t: 1714124193, i: 2 }), saleSeconds: Long("1714124193") }, { saleTimestamp: Timestamp({ t: 1714124193, i: 3 }), saleSeconds: Long("1714124193") }
使用 $tsSecond
in a Change Stream Cursor to Monitor Collection Changes
The example in this section uses $tsSecond
in a
change stream cursor to monitor changes to a
collection.
Create a change stream cursor on a collection
named cakeSales
that you will see later in this section:
cakeSalesCursor = db.cakeSales.watch( [ { $addFields: { clusterTimeSeconds: { $tsSecond: "$clusterTime" } } } ] )
In the example, the:
db.collection.watch()
method creates a change stream cursor for thecakeSales
collection and stores the cursor incakeSalesCursor
.$addFields
stage adds a field namedclusterTimeSeconds
tocakeSalesCursor
.$clusterTime
is the timestamp from the oplog entry for thecakeSales
collection change. See Command Response.$tsSecond
returns the seconds from$clusterTime
, which is stored inclusterTimeSeconds
.
创建cakeSales
集合,其中包含加利福尼亚州 ( CA
) 和华盛顿州 ( 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 } ] )
To monitor the cakeSales
collection changes, use
cakeSalesCursor
. For example, to obtain the next document from
cakeSalesCursor
, use the next()
method:
cakeSalesCursor.next()
The following example output shows the insert
details for the first
document added to the cakeSales
collection. The
clusterTimeSeconds
field contains the seconds from the
clusterTime
field.
_id: { _data: '82613A4A51000000032B022C0100296E5A100495189B4131584C56AC8BA9D540799F23461E5F696400290004' }, operationType: 'insert', clusterTime: Timestamp({ t: 1631210065, i: 3 }), 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 }, clusterTimeSeconds: 1631210065