use replaceOne when full document is available #867
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Currently in change_stream mode of incremental synchronization, while processing the change stream; in those cases that a FullDocument is available in an
"u"
(update) or"r"
(replace) event; MongoShake modifies it to{ $set: event.FullDocument }
which later in the writing phase will activate this code pathhttps://github.com/alibaba/MongoShake/blob/develop/executor/db_writer_bulk.go#L132-L164
meaning an
update
query will be used to write to the destination database instead ofreplace
. This causes a fatal error as having_id
in the event.FullDocument will fail the update query as MongoDB does not allow modification of the immutable_id
field. I believe the intended code path when a FullDocument is available is in fact the followinghttps://github.com/alibaba/MongoShake/blob/develop/executor/db_writer_bulk.go#L166-L182
so it makes sense to simply pass FullDocument as the object to activate the replace code path.