2017-10-10 3 views
0

既存のドキュメントに新しいフィールドを作成したいと思います。私はPOCOSにデータベースからすべての文書を取得するために次の行を使用しています:名前の文字列を使用してMongoドキュメントにフィールドを追加します。

var collection = _database.GetCollection<Address>(collectionName); 

私はその後、それぞれにいくつかの変更を行い、このラインを使用して戻ってそれらをデータベースに保存します。

collection.ReplaceOne(
filter: new BsonDocument("_id", a.id), 
options: new UpdateOptions { IsUpsert = true }, 
replacement: a); 

それはすべてうまく動作します。フィールドを追加するには

、私は次のことを試してみた:

a.ToBsonDocument().Add("RainfallMM", rainfallMM); 

しかし、それはそれをデータベースに作成しません。そのトリックはありますか?

+0

Addressフィールドにそのフィールドを追加しましたか? – BOR4

+0

こんにちはBOR、いいえ、私はそれをアドレスモデルに追加していません。私はフィールドを動的に追加するために探しています – Fidel

答えて

1

てみてください私はあなたのアドレスモデルに新しいプロパティを追加したコメントであなたを尋ね、あなたはあなたがいないと述べたと、あなたはそれを動的に追加します。ここではアドレスコレクションとしてコレクションを初期化し、mongoはデフォルトでアドレスモデルの一部ではないすべてのプロパティを無視します。

あなたはそれを動的に追加したい場合、あなたはあなたのコレクションはに開始方法を変更する必要があります。今、あなたのコレクションは、アドレスモデルに結び付けられていない、あなたが望むようにあなたがそれを扱うことができます

var collection = _database.GetCollection<BsonDocument>("addresses"); 

。すべてが今BSON文書です!あなたがこれを行うことができる。例えば

var inserted = MongoCollection.Find(x => true).FirstOrDefault(); 
inserted.Add(new BsonElement("RainfallMM", rainfallMM); 
MongoCollection.ReplaceOne(new BsonDocument("_id", inserted["_id"]), inserted); 

PS =が他のいくつかの回避策があり、この1つはあなたが好きではない場合、私はあなたの残りの部分を表示することができます)

はそれが役に立てば幸い!乾杯!

+0

すばらしい説明。ありがとうBOR – Fidel

+0

他の回避策を自由に回答として追加してください – Fidel

0

a.Add({"RainfallMM", rainfallMM}); 
2

@Fidelが私に尋ねたように、私は他の解決策を簡単に要約しようとします。受け入れられた答えの問題は、それが動作している間にアドレスモデルへの接続が失われ、OPがBSONドキュメントで作業していることです。

普通のBSON文書で作業するIMOは苦痛です。

彼が今までに戻ってアドレスのコレクションとしてコレクションを初期化することに変更したいと彼のようなものというエラーが発生しますDBから何かを取得しようとする場合:rainfallMM

ためのシリアル化情報が欠落してい

を無

[BsonIgnoreExtraElements] 
public class Address 
{ 
    ...fluff and stuff... 
} 

問題:

彼はこのような彼のAddressクラス上のタグを含めることによって、これを修正することができます彼は慎重ではない場合、彼は動的に追加されたプロパティのすべての情報を失う可能性があります。

彼が他のプロパティを動的に追加する場合、他の問題があります。今では、モデルにはない2つのプロパティがあり、地獄が緩んでいることを覚えなければなりません。

天気彼は気に入っていてもいなくても、彼の人生を楽にするために、おそらくアドレスモデルを変更する必要があります。そこ2つのアプローチがあり、その公式ドキュメントは、(私が思う)素晴らしいですが、私はちょうどそれをここにリンクされます:

http://mongodb.github.io/mongo-csharp-driver/2.4/examples/mixing_static_and_dynamic/

あなたがある1私に言わせれば、より良い私は正直、それはあなた次第を教えてくれます。ドキュメントから、追加のBSONドキュメントプロパティを使用する場合、追加のプロパティの名前付けについて心配する必要がないことがわかります。

これは私が今考えているすべてです! あなたのお役に立てば幸いです!

+0

もう一度すばらしい答えです。特に、「静的および動的な混合」の記事を参照してください。それはまさに私がやろうとしていることです。再びありがとう – Fidel

+0

問題はありません@フィデル。私は最善を尽くす=) – BOR4

関連する問題