我正在使用 Postman 测试我的 asp.net core 2.2 web api。我像这样手动编写 JSON (httppatch):
{
"query": "{\"name\": \"foo\"}",
"update": [ "{\"$set\":{\"name\":\"foo2\"}}","{\"$set\":{\"path\": \"foo2 path\"}}" ]
}
现在我在考虑如何在客户端构建补丁体。 我的问题是如何在 json 中获得与此代码等效的代码,使其看起来像我手动编写的代码?
var query = Builders<T>.Filter.Eq(e => e.name, "foo");
var updates = Builders<T>.Update.Set(e => e.name, "foo2").Set(e => e.Path, "foo2 path");
我想这全都与序列化有关,知道我该怎么做吗?
--更新--
我发现了这个:
var serializerRegistry = BsonSerializer.SerializerRegistry;
var documentSerializer = serializerRegistry.GetSerializer<T>();
var upList = updates.Render(documentSerializer, serializerRegistry);
但它只抓取最后一组它将所有集合合并为一个(我的错,感谢@Simon Mourier 指出我的错误!)
最佳答案
解决方法如下:
在客户端
// serializer
var serializerRegistry = BsonSerializer.SerializerRegistry;
var documentSerializer = serializerRegistry.GetSerializer<T>();
// filter and update
var filter = Builders<T>.Filter.Eq(e => e.Level, 2);
var updates = Builders<T>.Update
.Set(e => e.Name, "foo2")
.Set(e => e.Path, "foo2 path")
.Inc(e => e.Level, 1);
// get the string of the filter and the update
var filterString = filter.Render(documentSerializer, serializerRegistry);
var updateString = updates.Render(documentSerializer, serializerRegistry);
// instantiate patch object with properties to json
Patch patch = new Patch()
{
Query = filterString.ToJson(),
Update = updateString.ToJson()
};
// patch object to json
var patchJson = patch.ToJson();
在服务器端
[HttpPatch]
public async Task<IActionResult> PatchOne([FromBody]Patch patch)
{
// don't need to ModelState.isValid, it's done on binding
try
{
var update = BsonDocument.Parse(patch.Update);
var filter = BsonDocument.Parse(patch.Query);
var result = await _serviceBase.UpdateOneAsync(filter, update);
...
}
catch (System.Exception ex)
{
return StatusCode(StatusCodes.Status500InternalServerError, ex.Message.ToJson());
}
}
全局模态(我的解决方案结构)
public class Patch
{
[Required]
public string Query { get; set; }
[Required]
public string Update { get; set; }
}
感谢您的帮助!!
关于c# - Mongodb Bson类型转Json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55361391/