在C#中如何将MongoDB.Driver生成的更新对象转为指定字符串格式?
将MongoDB.Driver生成的UpdateDefinition转换为指定字符串格式
问题背景
我用MongoDB.Driver NuGet包生成了UpdateDefinition对象,但实际不是用来更新MongoDB,而是第三方API要求数据必须是$set: {Name:"TestName",Description:"TestDescription"}这种格式,需要把生成的UpdateDefinition转成该字符串。
我的代码示例:
class Program { class MyTest { public string Name { get; set; } = String.Empty; public string Description { get; set; } = String.Empty; } public static void Main() { var v = Builders<MyTest>.Update .Set(t => t.Name , "TestName") .Set(t => t.Description ,"TestDescription"); // 需要将v转换为目标字符串格式 } }
解决方案
可以通过将UpdateDefinition渲染为BsonDocument,再转JSON后调整格式的方式实现,这种方法能适配复杂的更新操作(比如多操作符、嵌套属性等),步骤如下:
- 使用
Render方法将UpdateDefinition转换为BsonDocument - 将BsonDocument转为标准JSON字符串
- 通过字符串处理或正则表达式调整为目标格式
完整代码示例:
class Program { class MyTest { public string Name { get; set; } = String.Empty; public string Description { get; set; } = String.Empty; } public static void Main() { var updateDef = Builders<MyTest>.Update .Set(t => t.Name, "TestName") .Set(t => t.Description, "TestDescription"); // 1. 渲染为BsonDocument var serializer = BsonSerializer.SerializerRegistry.GetSerializer<MyTest>(); var bsonDoc = updateDef.Render(serializer, BsonSerializer.SerializerRegistry); // 2. 转为无缩进的JSON字符串 var jsonStr = bsonDoc.ToJson(new JsonWriterSettings { Indent = false }); // 此时jsonStr为:{"$set":{"Name":"TestName","Description":"TestDescription"}} // 3. 调整为目标格式 // 方法1:字符串截取替换 var targetStr = jsonStr.TrimStart('{').TrimEnd('}') .Replace("\"$set\":{", "$set: {"); // 方法2:正则表达式(更精准,适配多操作符场景) // var targetStr = System.Text.RegularExpressions.Regex.Replace( // jsonStr, // @"^\{""(\$[a-z]+)"":(\{.*\})\}$", // "$1: $2" // ); Console.WriteLine(targetStr); // 输出:$set: {Name:"TestName",Description:"TestDescription"} } }
说明
Render方法是MongoDB.Driver提供的核心方法,能将强类型的UpdateDefinition转换为MongoDB原生的BsonDocument结构- 如果你的更新操作包含多个操作符(比如同时有
$set和$inc),这种方法也能自动处理,生成对应的多操作符字符串 - 默认情况下,属性名会直接映射为MongoDB字段名,如果需要自定义字段名,可以给MyTest的属性添加
[BsonElement("自定义字段名")]特性
内容的提问来源于stack exchange,提问作者No Name
相关产品推荐
相关产品推荐

