2016-12-23 10 views
0

私は以下のユースケースは、MongoDBの3.4で実現可能であるかどうかを判断しようとしている:私はこれに類似したスキーマで文書を含むコレクションを持っている:既存のサブドキュメントをMongoDBの埋め込み配列にプッシュするには?

{ 
    "_id": ObjectId("..."), 
    "data": { 
     "fname": "John", 
     "lname": "Doe" 
    }, 
    "history": [] 
} 

dataフィールドは、現在の状態を保持するためのものですエンティティとhistory配列は、最新のバージョンを保持することを目的としています(最大ドキュメントサイズとクエリの目的を考慮しています)。

アプリケーションロジックから更新操作が発行された場合、$pushdataフィールドをhistory配列に入れてエンティティの新しい状態に置き換えます。私はMongoDBのドキュメントでこれについて何も見つけることができませんでした。SOで見つけたすべての質問は、完全に新しいオブジェクトを配列にプッシュし、既存のフィールドの値を「移動」するのではなく扱います。 $push操作でドキュメントフィールドを参照することはできますか?

+1

私はあなたのアプリケーションコードがそれを処理する必要がありますと信じています。 1) "データ"(データベース読み込み)を読み、2)ヒストロイ(プッシュ)を読み込み、3) "データ"(アプリケーションのローカルオブジェクト)の新しい状態を追加し、最終的にストアする(データベース操作を再度)。このケースでは、Springデータを使用してください。 –

+0

@ TheNeoNoirDeveloperここからどこに来ているのか理解しています。私がここでやろうとしているのは、 'MongoDB'のupdate-in-place機能を利用して、全体的な操作が原子的に実行されるようにすることです。私は@kittuが投稿したものと非常によく似た何かをしてしまった。下の彼の答えを見てください。私は 'C#'、BTWを使用しています。 –

答えて

0
db.collection.update({"_id": "1234"}, {"$set": {"data": {"data-value"}}}, {"$push": {"history": {"history-value"}}) 

このように書くと、自動的に値を履歴にプッシュし、データを現在の状態に変更します。

関連する問題