[解決済み】MongoDBでデータのバージョニングを実装する方法
質問
MongoDBでデータのバージョニングをどのように実装するか、あなたの考えを聞かせてください。(私は Cassandraに関する同様の質問 . もし、どのデータベースが良いという考えがあれば、共有してください)
私は単純なアドレス帳のレコードをバージョンアップする必要があるとします。(アドレスブックのレコードはフラットなjsonオブジェクトとして保存されています)。私は履歴を期待しています。
- 使用頻度が低い
- タイムマシン的な演出をするために一度に使う
- 1つのレコードに数百以上のバージョンが存在することはありません。 履歴が消えることはありません。
以下のようなアプローチを考えています。
-
レコードやレコードの変更の履歴を保存するための新しいオブジェクトコレクションを作成します。これは、アドレス帳のエントリへの参照を持つ、バージョンごとに1つのオブジェクトを格納するものです。そのようなレコードは、次のように見えるでしょう。
{ '_id': '新しいID', 'user': user_id, 'timestamp': タイムスタンプ。 'address_book_id': 'アドレス帳のレコードのid'. 'old_record': {'first_name': 'Jon', 'last_name': 'Doe' ...}. }
この方法は、ドキュメントごとにバージョンの配列を保存するように修正することができます。しかし、これは利点がなく、遅いアプローチに思えます。
-
アドレス帳のエントリに添付されたシリアル化(JSON)オブジェクトとしてバージョンを保存する。このようなオブジェクトを MongoDB ドキュメントにアタッチする方法がよくわかりません。おそらく、文字列の配列として格納するのでしょう。 ( CouchDBのシンプルなドキュメントのバージョニングの後にモデル化された )
解決方法は?
このことに飛び込むと、まず大きな疑問が湧いてきます。 チェンジセットをどのように保存しますか? ?
- ディフューズ?
- レコードの丸ごとコピー?
私個人の考えとしては、差分を保存するのがいいと思います。この差分の表示は本当に特殊な動作なので、差分は別の "history"コレクションに置きます。
別のコレクションを使用するのは、メモリスペースを節約するためです。一般に、単純なクエリでは、完全な履歴は必要ありません。履歴をオブジェクトから除外することで、そのデータがクエリされる際に頻繁にアクセスされるメモリから除外することができるのです。
私の生活を楽にするために、履歴ドキュメントにタイムスタンプ付き差分の辞書を含ませることにします。このようなものです。
{
_id : "id of address book record",
changes : {
1234567 : { "city" : "Omaha", "state" : "Nebraska" },
1234568 : { "city" : "Kansas City", "state" : "Missouri" }
}
}
私の生活を本当に簡単にするために、データにアクセスするために使用するDataObjects (EntityWrapper, 何でも) の一部にします。一般的に、これらのオブジェクトは何らかの形で履歴を持っているので、簡単に
save()
メソッドでこの変更を同時に行うことができます。
更新日:2015年10月
があるようになったようです。 JSONの差分を処理するための仕様 . これは、差分や変更を保存するための、より堅牢な方法のように思えます。
関連
-
[解決済み】MongoDBシェルですべてのコレクションを一覧表示するには?
-
[解決済み] MongoDB Compass: select distinct フィールド値
-
[解決済み] MongoDBのデフォルトのユーザーとパスワードは何ですか?
-
[解決済み] 同じデータベース内でコレクションをコピーする最も速い方法は何ですか?
-
問題が発生しました -----mongodb-------Uncaught TypeError: 未定義のプロパティ 'value' を読み取れませんでした。
-
[解決済み] or' 条件を含む MongoDB クエリ
-
[解決済み] MongoDBに "like "を使ってクエリを実行する方法
-
[解決済み] pandasを使った "大量データ "ワークフロー【終了しました
-
[解決済み] コマンドラインからMongoDBデータベースを削除する方法を教えてください。
-
[解決済み】MongoDBのシェルで20以上のアイテム(ドキュメント)をプリントアウトする方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] MongoDBでフィールドが存在することを確認する
-
[解決済み] MongoDB の重複レコードを検索する
-
[解決済み] Mongo Restart Error -- /var/run/mongodb/mongod.pid が存在する
-
[解決済み] mongodb サーバーに接続しようとすると、mongo コマンドが認識されません。
-
[解決済み] MongoDBと同等ではない
-
[解決済み】Node.jsでMongooseを使用してページングする方法は?
-
[解決済み】MongoDBで、あるデータベースから別のデータベースにコレクションをコピーする方法
-
[解決済み】ドキュメントの配列内のオブジェクトを更新する方法(入れ子更新)について)
-
[解決済み】MongoDB コレクションの変更をリッスンする方法は?
-
[解決済み] MongoDB/NoSQL。ドキュメントの変更履歴を残す