使用 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);
关注与建议
重命名后的字段需要前缀 CustomFields.
作为 "CustomFields.Сheckpoint Comment-test"
因为您正在更新对象中的嵌套字段。如果没有前缀 CustomFields.
,Сheckpoint Comment-test
将与 CustomFields
处于同一级别,但不在 CustomFields
对象内。
filter
和
filter.Where(x => true)
可以换成
filter.Empty
因为它们是等价的。 (因为第一个强制过滤条件绝对为真,而第二个不应用过滤条件)。
我有一个文档,里面有一个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);
关注与建议
重命名后的字段需要前缀
CustomFields.
作为"CustomFields.Сheckpoint Comment-test"
因为您正在更新对象中的嵌套字段。如果没有前缀CustomFields.
,Сheckpoint Comment-test
将与CustomFields
处于同一级别,但不在CustomFields
对象内。filter
和
filter.Where(x => true)
可以换成
filter.Empty
因为它们是等价的。 (因为第一个强制过滤条件绝对为真,而第二个不应用过滤条件)。