2017-10-10 75 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

相关问题