Change streams leverage the replica set oplog, so you should not expect the change stream to report an event if the document is not actually changed. To test this, I spawned two mongo shells connected to the same replica set.
In the first, I inserted a new document and performed an update that did not modify the document.
rs0:PRIMARY> db.foo.insert({x:1})
WriteResult({ "nInserted" : 1 })
rs0:PRIMARY> db.foo.updateOne({x:1},{$set:{x:1}});
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 0 }
In the second shell, I opened a change stream shortly before executing the insert/update operations and observed that only one event was reported:
rs0:PRIMARY> db.foo.watch()
{ "_id" : { "_data" : "825DEEF44E000000022B022C0100296E5A10048054A49ABDBD4530A95A9F02F3124A1746645F696400645DEEF44E406545D3AF8769CE0004" }, "operationType" : "insert", "clusterTime" : Timestamp(1575941198, 2), "fullDocument" : { "_id" : ObjectId("5deef44e406545d3af8769ce"), "x" : 1 }, "ns" : { "db" : "test", "coll" : "foo" }, "documentKey" : { "_id" : ObjectId("5deef44e406545d3af8769ce") } }