C# Mongodb Bson类型转换为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

我正在用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").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; }
}