C# Mongodb Bson类型转换为Json
我正在用Postman测试我的asp.NETCore2.2WebAPI。我像这样手动编写JSON(httppatch): 现在我正在考虑如何在客户端构建补丁主体。 我的问题是如何在json中获得与此代码等效的代码,使其看起来像我手动编写的代码C# Mongodb Bson类型转换为Json,c#,json,mongodb,C#,Json,Mongodb,我正在用Postman测试我的asp.NETCore2.2WebAPI。我像这样手动编写JSON(httppatch): 现在我正在考虑如何在客户端构建补丁主体。 我的问题是如何在json中获得与此代码等效的代码,使其看起来像我手动编写的代码 var query = Builders<T>.Filter.Eq(e => e.name, "foo"); var updates = Builders<T>.Update.Set(e => e.name, "foo2
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 query=Builders.Filter.Eq(e=>e.name,“foo”);
var updates=Builders.Update.Set(e=>e.name,“foo2”).Set(e=>e.Path,“foo2路径”);
我想这都是关于序列化的,你知道我该怎么做吗
--更新--
我发现:
var serializerRegistry = BsonSerializer.SerializerRegistry;
var documentSerializer = serializerRegistry.GetSerializer<T>();
var upList = updates.Render(documentSerializer, serializerRegistry);
var serializerRegistry=BsonSerializer.serializerRegistry;
var documentSerializer=serializerRegistry.GetSerializer();
var upList=updates.Render(documentSerializer、serializerRegistry);
但它只抓取最后一个集合,它将所有集合合并在一个集合中(我的错,多亏@Simon Mourier指出了我的错误!)我找到了查看查询的方法 您需要进行查询并将其保存在var中
var query = Builders<T>.Filter.Eq(e => e.name, "foo");
var makeQuery = _collection.Find(query).ToString();
var query=Builders.Filter.Eq(e=>e.name,“foo”);
var makeQuery=_collection.Find(query.ToString();
makeQuery的值为Filter.Eq以下是解决方案:
在客户端
// 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; }
}
谢谢你的帮助
Builders.Update.Set(e=>e.name,“foo2”).Set(e=>e.Path,“foo2 Path”).ToJson()
你试过这个吗?我试过了,得到的结果是:“{\”:\“CombinedUpdateDefinition`1\”}”只是出于好奇,您是否正在创建一个webAPI端点,该端点接受mongo查询/更新的json表示,并在没有任何验证的情况下对mongod执行它?您的注释中的代码是正确的。它不仅获取了最后一个集合,它还将两个集合合并为:{“$set”:{“name”:“foo2”,“path”:“foo2 path”}}
,这是预期的。好吧,您有一个完整的解决方案,Render是输出到Bson/Json等的方法。它存在于所有可以使用C#构建的构造上。你还需要什么?
public class Patch
{
[Required]
public string Query { get; set; }
[Required]
public string Update { get; set; }
}