だから、質問に直接答えるために...
スキーマレスストレージは確かにMongoDBを使用する説得力のある理由ですが、ご指摘のとおり、JSONをRDBMSに保存するのもかなり簡単です。 MongoDBの背後にある力は、スキーマレスストレージに対する豊富なクエリにあります。
JSONフィールドの更新に関する図の小さな欠陥を指摘するかもしれませんが、それは単に現在の値を取得し、ドキュメントを更新してからデータベースにプッシュするだけの問題ではありません。プロセスはすべてトランザクションでラップする必要があります。データベースの非正規化を開始するまで、トランザクションはかなり単純になる傾向があります。次に、賛成票を記録するのと同じくらい簡単なことで、スキーマ全体のテーブルをロックできます。
MongoDBでは、トランザクションはありません。ただし、ほとんどの場合、操作はアトミック更新を可能にする方法で構造化できます。これには通常、SQLパラダイムからの劇的な変化が伴いますが、オブジェクトをテーブルに強制しようとするのをやめれば、かなり明白だと思います。少なくとも、他の多くの人々があなたが直面するのと同じ問題に遭遇し、Mongoコミュニティは彼らが克服した課題についてかなりオープンで声を上げる傾向があります。
「安全な書き込み」とは、書き込みのたびに自動「getLastError()」をオンにするオプションを意味すると思います。 DBCollectionには非常に薄いラッパーがあり、getLastError()が呼び出されるタイミングをきめ細かく制御できます。ただし、私たちのポリシーは、データの「重要性」に基づいているのではなく、クエリに続くコードが、次の読み取りで変更がすぐに表示されることを期待しているかどうかに基づいています。
一般的に言って、これはまだ不十分な指標であり、代わりに同じ動作のためにfindAndModify()に移行しました。まだ明示的にgetLastError()を呼び出す場合は、重複している可能性のある_idを指定してinsert()を挿入する場合など、データベースが書き込みを拒否する可能性が高い場合です。
まだ復元する必要がないため、バックアップ/復元ポリシーが有効かどうかについてはお話しできません。バックアップについては、MongoDBの推奨事項に従っています。 @ mark-hillickは、それらを要約するという素晴らしい仕事をしました。レプリカセットを使用しており、MongoDBバージョンを移行し、新しいレプリカメンバーを導入しました。これまでのところダウンタイムは発生していないため、この時点までうまく話せるかどうかはわかりません。
したがって、私の経験では、MongoDBは、トランザクションをアトミック操作に置き換えることができるほど豊富なクエリプリミティブのセットを使用してスキーマレスデータのストレージを提供します。 10年以上のSQLの経験を学ぶのは難しいことですが、私が遭遇したすべての問題は、コミュニティまたは10genによって直接対処されています。データが失われたり、思い出せるようなダウンタイムが発生したりすることはありません。
簡単に言うと、MongoDBは、クエリ、メンテナンス、スケーラビリティ、信頼性の点で、これまで使用した中で最高のデータストレージエコシステムです。明確にリレーショナルであり、良心的にSQL以外のものを使用できないアプリケーションがない限り、MongoDBを使用するためにあらゆる努力をします。
私は10genで働いていませんが、働いている人々にとても感謝しています。