【问题标题】:MongoDB - Update field or Add field if not present on BsonDocument C#MongoDB - 如果 BsonDocument C# 上不存在,则更新字段或添加字段
【发布时间】:2018-02-08 23:29:15
【问题描述】:

我正在尝试将提供给 API 的任何 JSON 存储到 BsonDocument 中,这是使用 C# 驱动程序的另一个文档上的字段

但是,当我尝试使用 UpdateOne 方法时,它只是将文档替换为我提交的任何内容。这是我的顶级 mongo 文档

public class SomeMongoDocument 
{
    public ObjectId _id { get; set; }

    public string FileName { get; set; }

    public BsonDocument Metadata { get; set; }
}

我想先设置 Metadata 属性,然后再更新它,更新可能不包含所有发送的初始 Metadata。所以当我尝试用这个更新文档时:

public void UpdateMetadata(string filename, string metadata)
{
        var filter = Builders<SomeMongoDocument>.Filter.Eq(e => e.FileName, filename;

        BsonDocument document = BsonSerializer.Deserialize<BsonDocument>(metadata);

        var update = Builders<SomeMongoDocument>.Update.Set(e => e.Metadata, document);

        this.MongoCollection.UpdateOne(filter, update);

}

当我将它转换为 bson 文档时,它只是覆盖 BsonDocument 并删除字符串中不存在的属性。

那么我该怎么做:

更新现有属性,或在添加新属性时保留已有的属性。谢谢

【问题讨论】:

    标签: c# mongodb mongodb-query mongodb-.net-driver


    【解决方案1】:

    { $set: { "metadata": { ... } } } 替换整个 metadata 嵌入文档。如果要替换嵌入文档中的值,则应在 $set 运算符中指定它们,例如:

    { $set: { "metadata.innerField1": "SomeValue1", "metadata.innerField2": "SomeValue2" }

    或使用 MongoDB .Net 驱动程序:

    Builders<SomeMongoDocument>.Update
        .Set(e => e.Metadata.InnerField1, document.InnerField1)
        .Set(e => e.Metadata.InnerField2, document.InnerField2)
        // ...
    

    由于您的文档中没有预定义的属性,因此您无法以这种方式在代码中对它们进行硬编码。在这种情况下,您可以枚举 BsonDocument 元素并将它们添加到更新定义中:

    UpdateDefinition<SomeMongoDocument> update = null;
    foreach (BsonElement element in document)
    {
        update = update?.Set(e => e.Metadata[element.Name], element.Value) ??
                    Builders<SomeMongoDocument>.Update.Set(e => e.Metadata[element.Name], element.Value);
    }
    
    if (update != null)
    {
        this.MongoCollection.UpdateOne(filter, update);
    }
    

    【讨论】:

      猜你喜欢
      • 2021-04-24
      • 1970-01-01
      • 2022-11-18
      • 1970-01-01
      • 2020-02-17
      • 2014-03-31
      • 1970-01-01
      • 2014-07-15
      • 2016-08-25
      相关资源
      最近更新 更多