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

Add field to a Mongo document using a string for its name

我想在现有文档上创建一个新字段。我正在使用以下行将所有文档从数据库中提取到 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);

但是它没有进入数据库。有什么技巧吗?

试试

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

我在评论中问你是否添加了新的 属性 到地址模型,你说你没有,你想动态添加它。这里的技巧是将 collection 初始化为地址的 collection,并且默认情况下 mongo 忽略不属于地址模型的所有属性。

如果您想动态添加它,您需要将 collection 的启动方式更改为:

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

现在您的 collection 不再绑定到地址模型,您可以随心所欲地使用它。现在一切都是BSON文档!

例如你可以这样做:

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

PS 还有其他一些解决方法,如果您不喜欢这个,我可以告诉您其余的 =)

希望对您有所帮助!干杯!

按照@Fidel 的要求,我将尝试简要总结其他解决方案。接受的答案中的问题是,虽然它可以工作,但它失去了与 Address 模型的连接,并且 OP 一直在使用 BSON 文档。

IMO 使用纯 BSON 文档很痛苦。

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

Missing serialization information for rainfallMM

他可以通过在他的地址 class 上方添加标签来解决这个问题,如下所示:

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

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

另一个问题是如果他动态添加另一个 属性。现在他必须记住有 2 个属性不在模型中,他妈的乱七八糟。

不管他喜欢与否,为了让他的生活更轻松,他可能不得不修改地址模型。有 2 种方法,它们的官方文档很棒(我认为),所以我将 link 放在这里:

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

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

我现在能想到的就是这些了! 希望对你有帮助!