使用 MongoDB.Driver 重命名 BsonDocument 中的嵌套字段

Rename nested field in BsonDocument with MongoDB.Driver

我有一个文档,里面有一个CustomFields文档,里面还有文档。

如何将 Checkpoint Comment 文档名称正确更新为 Checkpoint Comment-test

我试过如下但它不起作用。

var filter = Builders<Visit>.Filter;

UpdateDefinition<Visit> update = Builders<Visit>.Update.Rename(x => x.CustomFields.FirstOrDefault(f => f.Name == "Сheckpoint Comment").Name, "Сheckpoint Comment-test");
Collection.UpdateMany(filter.Where(x => true), update);
{
  "_id": ObjectId("61e5707d23516865481ebee7"),
  "CustomFields": {
    "Сheckpoint Comment": {
      "FieldId": ObjectId("6149d5de44175b8324482904"),
      "Type": "Text",
      "ValueBson": "test"
    },
    "Time of arrival at the checkpoint": {
      "FieldId": ObjectId("6149d5de44175b8324482905"),
      "Type": "DateTime",
      "ValueBson": null
    }
  }
}

解决方案

解决方案 1

如果您将 [BsonElement] 属性应用于 class' 属性,如下所示:

public class Visit
{
    public ObjectId Id { get; set; }
    public CustomField CustomFields { get; set; }
}

public class CustomField
{
    [BsonElement("Сheckpoint Comment")]
    public BsonProp Checkpoint { get; set; }
    [BsonElement("Time of arrival at the checkpoint")]
    public BsonProp Time { get; set; }
}

public class BsonProp
{
   public ObjectId FieldId { get; set; }
   public string Type { get; set; }
   public string ValueBson { get; set; }
}

然后指定要重命名的字段为:

UpdateDefinition<Visit> update = Builders<Visit>.Update.Rename(x => x.CustomFields.Checkpoint, "CustomFields.Сheckpoint Comment-test");
Collection.UpdateMany(filter.Empty, update);

解决方案 2

不应用[BsonElement]属性,只需在string中指定要重命名的字段即可。

UpdateDefinition<Visit> update = Builders<Visit>.Update.Rename("CustomFields.Сheckpoint Comment", "CustomFields.Сheckpoint Comment-test");
Collection.UpdateMany(filter.Empty, update);

关注与建议

  1. 重命名后的字段需要前缀 CustomFields. 作为 "CustomFields.Сheckpoint Comment-test" 因为您正在更新对象中的嵌套字段。如果没有前缀 CustomFields.Сheckpoint Comment-test 将与 CustomFields 处于同一级别,但不在 CustomFields 对象内。

  2. filter

filter.Where(x => true)

可以换成

filter.Empty

因为它们是等价的。 (因为第一个强制过滤条件绝对为真,而第二个不应用过滤条件)。