$tsIncrement(集計)
定義
バージョン 5.1 で追加。
タイムスタンプからの増分序数をlong
として返します。
同じ秒内に複数のイベントが発生した場合、増分序数は各イベントを一意に識別します。
$tsIncrement
構文:
{ $tsIncrement: <expression> }
動作
$tsIncrement
次の値を返します。
Null
入力式がnull
と評価された場合、または欠落しているフィールドを参照している場合。
例
タイムスタンプ フィールドからの増分序数の取得
会社の株式金融マーケットの売上情報を含むstockSales
コレクションを作成します。
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) } ] )
タイムスタンプコンストラクター内で、 は次の操作を行います。
最初の値は、 UNIX エポックからの経過秒数です。
2 番目の値は、増分序数です。 同じ秒内に複数のイベントが発生した場合、増分序数は各イベントを一意に識別します。
次の例では、 ステージで$tsIncrement
$project
を使用して、株式販売saleTimestamp
フィールドから増分序数を返します。
db.stockSales.aggregate( [ { $project: { _id: 0, saleTimestamp: 1, saleIncrement: { $tsIncrement: "$saleTimestamp" } } } ] )
$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
変更ストリーム カーソルで を使用してコレクションの変更を監視
このセクションの例では、$tsIncrement
変更ストリーム カーソル で を使用して、同じ秒数内にコレクションに対して行われた他のすべての変更を返します。
このセクションの後半では、 cakeSales
という名前のコレクションに変更ストリーム カーソルを作成します。
cakeSalesCursor = db.cakeSales.watch( [ { $match: { $expr: { $eq: [ { $mod: [ { $tsIncrement: "$clusterTime" } , 2 ] }, 0 ] } } } ] )
この例では、次のことは行われません。
db.collection.watch()
メソッドは、cakeSales
コレクションの変更ストリーム カーソルを作成し、そのカーソルをcakeSalesCursor
に保存します。$expr
演算子:$mod
2
$clusterTime
$tsIncrement
によって返される 変数の増分序数に適用します。$clusterTime
は、cakeSales
コレクションが変更されたときのoplogエントリのタイムスタンプです。 コマンドの応答 を参照してください。
カリフォルニア州(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 } ] )
cakeSales
コレクションの変更をモニターするには、 cakeSalesCursor
を使用します。 たとえば、 cakeSalesCursor
から次のドキュメントを取得するには、 next()
メソッドを使用します。
cakeSalesCursor.next()
ドキュメントがcakeSales
に追加された秒数によって、 cakeSalesCursor.next()
からの出力は異なります。 たとえば、ドキュメントの追加は 1 秒を超えることがあります。
次のcakeSalesCursor.next()
出力の例には、 cakeSales
コレクションに追加された最初のドキュメントのinsert
の詳細が示されています。 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 }
cakeSalesCursor.next()
を再度実行すると、 clusterTime
の増分序数i
4
であるcakeSales
ドキュメントが返され、 i
が3
であるドキュメントは省略されます。