2017-10-10 76 views
0

我想在現有文檔上創建一個新字段。我使用下面的行把所有的文件從數據庫中到波蘇斯:使用字符串名稱將字段添加到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還有一些其他的解決方法,如果這一個你不喜歡我可以告訴你,其餘=)

希望它能幫助!乾杯!

+0

Superly解釋。謝謝BOR – Fidel

+0

隨時添加您的其他解決方法作爲答案 – Fidel

0

嘗試

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

正如@Fidel問我,我會盡量簡要總結其他解決方案。在接受的答案中的問題是,雖然它的工作,它失去了與地址模型的連接,OP與BSON文檔一起工作。

國際海事組織使用普通的BSON文件是痛苦的。

如果他想變回初始化集合作爲地址的集合,並試圖得到任何東西從數據庫中他將遇到一個錯誤,說是這樣的:

缺少系列化信息rainfallMM

他可以通過包括上述講話類這樣的標籤解決這個問題:

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

沒有問題w如果他不小心,他可以在動態添加的屬性中丟失所有信息。

其他問題是如果他動態添加另一個屬性。現在他必須記住有兩個屬性不在模型中,地獄崩潰。

他喜歡與否的天氣,爲了讓自己的生活更輕鬆,他可能不得不修改Address模型。有2種方法和他們的官方文件是偉大的(我認爲),所以我只會在此處鏈接:

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

如果你問我哪一個更好,我會誠實地告訴你,這取決於你。從文檔中你會看到,如果你使用額外的BSON文檔屬性,你不必擔心命名你的額外屬性。

這就是我現在所能想到的! 希望它可以幫助你!

+0

再次是一個很好的答案。特別是對「混合靜態和動態」文章的引用。這正是我想要做的。再次感謝 – Fidel

+0

@Fidel沒有問題。我盡我所能=) – BOR4

相關問題