使用字符串作为名称将字段添加到Mongo文档

时间:2017-10-10 13:17:21

标签: c# mongodb bson

我想在现有文档上创建一个新字段。我使用以下行将所有文档从数据库中导入POCO:

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);

但它没有进入数据库。它有诀窍吗?

3 个答案:

答案 0 :(得分:2)

@Fidel问我,我会尝试简要总结其他解决方案。接受的答案中的问题是,当它工作时,它失去了它与地址模型的连接,并且OP与使用BSON文档相关。

IMO使用普通的BSON文件很痛苦。

如果他希望更改回初始化集合作为地址集合并尝试从db获取任何内容,他将会遇到类似以下内容的错误:

  

缺少rainMM的序列化信息

他可以通过将tag添加到他的Address类之上来解决这个问题:

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

现在的问题是,如果他不小心,他可能会在动态添加的属性中丢失所有信息。

其他问题是他是否动态添加另一个属性。现在他必须记住,有2个属性不在模型中,地狱就会松动。

他喜欢或不喜欢的天气,为了让他的生活更轻松,他可能不得不修改地址模型。有两种方法,他们的官方文档很棒(我认为),所以我将在这里链接:

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

如果你问我哪一个更好,我会诚实地告诉你这取决于你。从文档中你会看到,如果你使用额外的BSON文档属性,你不必担心命名你的额外属性。

这就是我现在能想到的一切! 希望它能帮到你!

答案 1 :(得分: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还有其他一些解决方法,如果你不喜欢我可以告诉你剩下的那些=)

希望它有所帮助!干杯!

答案 2 :(得分:0)

尝试

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