我想在现有文档上创建一个新字段。我使用以下行将所有文档从数据库中导入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);
但它没有进入数据库。它有诀窍吗?
答案 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});