@@ -743,8 +743,8 @@ Change streams are resumable by specifying a resume token to either
743
743
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
744
744
745
745
You can resume a change stream after a specific event by passing a resume token
746
- to ``resumeAfter`` when opening the cursor. For the resume token, use the
747
- ``_id`` value of the :ref:`change stream event document <change-stream-output>`.
746
+ to ``resumeAfter`` when opening the cursor.
747
+
748
748
See :ref:`change-stream-resume-token` for more information on the resume token.
749
749
750
750
.. important::
@@ -941,9 +941,9 @@ You can start a new change stream after a specific event by passing a resume
941
941
token to ``startAfter`` when opening the cursor. Unlike
942
942
:ref:`resumeAfter <change-stream-resume-after>`, ``startAfter`` can
943
943
resume notifications after an :ref:`invalidate event <change-event-invalidate>`
944
- by creating a new change stream. For the resume token, use the ``_id`` value of
945
- the :ref:`change stream event document <change-stream-output>`. See
946
- :ref:`change-stream-resume-token` for more information on the resume token.
944
+ by creating a new change stream.
945
+
946
+ See :ref:`change-stream-resume-token` for more information on the resume token.
947
947
948
948
.. important::
949
949
@@ -956,22 +956,133 @@ the :ref:`change stream event document <change-stream-output>`. See
956
956
Resume Tokens
957
957
~~~~~~~~~~~~~
958
958
959
- The ``_id`` value of a :ref:`change stream event document
960
- <change-stream-output>` acts as the resume token:
959
+ The resume token is available from multiple sources:
960
+
961
+ .. list-table::
962
+ :header-rows: 1
963
+ :stub-columns: 1
964
+ :widths: 20 80
965
+
966
+ * - Source
967
+ - Description
968
+
969
+ * - :ref:`Change Events <change-event-resume-token>`
970
+ - Each change event notification includes a resume token
971
+ on the ``_id`` field.
972
+
973
+ * - :ref:`Aggregation <aggregate-resume-token>`
974
+ - The :pipeline:`$changeStream` aggregation stage includes
975
+ a resume token on the ``cursor.postBatchResumeToken`` field.
976
+
977
+ This field only appears when using the :dbcommand:`aggregate`
978
+ command.
979
+
980
+ * - :ref:`Get More <getMore-resume-token>`
981
+ - The :dbcommand:`getMore` command includes a resume token on the
982
+ ``cursor.postBatchResumeToken`` field.
983
+
984
+ .. versionchanged:: 4.2
985
+
986
+ .. include:: /includes/extracts/4.2-changes-change-stream-modification-error.rst
987
+
988
+ .. _change-event-resume-token:
989
+
990
+ Resume Tokens from Change Events
991
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
992
+
993
+ Change event notifications include a resume token on the ``_id`` field:
994
+
995
+ .. code-block:: json
996
+ :copyable: false
997
+ :emphasize-lines: 2-4
961
998
962
- .. code-block:: none
963
999
964
1000
{
965
- "_data" : <BinData|hex string>
1001
+ "_id": {
1002
+ "_data": "82635019A0000000012B042C0100296E5A1004AB1154ACACD849A48C61756D70D3B21F463C6F7065726174696F6E54797065003C696E736572740046646F63756D656E744B65790046645F69640064635019A078BE67426D7CF4D2000004"
1003
+ },
1004
+ "operationType": "insert",
1005
+ "clusterTime": Timestamp({ "t": 1666193824, "i": 1 }),
1006
+ "collectionUUID": new UUID("ab1154ac-acd8-49a4-8c61-756d70d3b21f"),
1007
+ "fullDocument": {
1008
+ "_id": ObjectId("635019a078be67426d7cf4d2"'),
1009
+ "name": "Giovanni Verga"
1010
+ },
1011
+ "ns": {
1012
+ "db": "test",
1013
+ "coll": "names"
1014
+ },
1015
+ "documentKey": {
1016
+ "_id": ObjectId("635019a078be67426d7cf4d2")
1017
+ }
966
1018
}
967
1019
968
- .. include:: /includes/extracts/changestream-resume-token-versions-4.2-greater.rst
969
1020
970
- .. include:: /includes/extracts/changestream -resume-token-hex-change.rst
1021
+ .. _aggregate -resume-token:
971
1022
972
- .. tip::
1023
+ Resume Tokens from ``aggregate``
1024
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1025
+
1026
+ When using the :dbcommand:`aggregate` command, the :pipeline:`$changeStream`
1027
+ aggregation stage includes a resume token on the
1028
+ ``cursor.postBatchResumeToken`` field:
1029
+
1030
+ .. code-block:: json
1031
+ :copyable: false
1032
+ :emphasize-lines: 4-6
1033
+
1034
+ {
1035
+ "cursor": {
1036
+ "firstBatch": [],
1037
+ "postBatchResumeToken": {
1038
+ "_data": "8263515EAC000000022B0429296E1404"
1039
+ },
1040
+ "id": Long("4309380460777152828"),
1041
+ "ns": "test.names"
1042
+ },
1043
+ "ok": 1,
1044
+ "$clusterTime": {
1045
+ "clusterTime": Timestamp({ "t": 1666277036, "i": 1 }),
1046
+ "signature": {
1047
+ "hash": Binary(Buffer.from("0000000000000000000000000000000000000000", "hex"), 0),
1048
+ "keyId": Long("0")
1049
+ }
1050
+ },
1051
+ "operationTime": Timestamp({ "t": 1666277036, "i": 1 })
1052
+ }
1053
+
1054
+ .. _getMore-resume-token:
1055
+
1056
+ Resume Tokens from ``getMore``
1057
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1058
+
1059
+ The :dbcommand:`getMore` command also includes a resume token on the
1060
+ ``cursor.postBatchResumeToken`` field:
1061
+
1062
+ .. code-block:: json
1063
+ :copyable: false
1064
+ :emphasize-lines: 4-6
1065
+
1066
+ {
1067
+ "cursor": {
1068
+ "nextBatch": [],
1069
+ "postBatchResumeToken": {
1070
+ "_data": "8263515979000000022B0429296E1404"
1071
+ },
1072
+ "id": Long("7049907285270685005"),
1073
+ "ns": "test.names"
1074
+ },
1075
+ "ok": 1,
1076
+ "$clusterTime": {
1077
+ "clusterTime": Timestamp( { "t": 1666275705, "i": 1 } ),
1078
+ "signature": {
1079
+ "hash": Binary(Buffer.from("0000000000000000000000000000000000000000", "hex"), 0),
1080
+ "keyId": Long("0")
1081
+ }
1082
+ },
1083
+ "operationTime": Timestamp({ "t": 1666275705, "i": 1 })
1084
+ }
973
1085
974
- .. include:: /includes/extracts/4.2-changes-change-stream-modification-error.rst
975
1086
976
1087
Use Cases
977
1088
---------
0 commit comments