このアプローチの問題は、それが非常に低レベルであることです。この情報をアプリケーションの観点から意味のあるところまで復元するのは、非常に面倒です。
たとえば、ユーザーの名前を変更するとします。ユーザー オブジェクトを使用$set
しますか、それとも置き換えますか? アプリケーションの観点からは問題ありませんが、oplog はまったく異なって見えます。また、replace を使用している場合、oplog に含まれる情報には、変更だけではなく、新しい状態のみが含まれます。つまり、実際に何が起こっていたのかを理解する唯一の方法は、すべての操作を完全に再生することです (したがって、古い状態と新しい状態が得られます)。
また、oplog には、データベース ユーザーをアプリケーション ユーザーとして使用している場合を除き、どのユーザーがどの操作を実行したかに関する情報は含まれません。
私の意見では、これはアプリケーションによって処理されるべきです。たとえば、Unit of Work パターンを使用できますが、クライアントで断続的にのみ使用する代わりに、Unit of Work (またはその表現) をデータベースに実際にシリアル化したい場合があります。このパターンには名前があると確信していますが、現時点では思い出せません。