c# - Mongodb Bson类型转Json

标签 c# json mongodb

我正在使用 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/

相关文章:

java - 使用 JAX-RS 处理 JSON 响应

node.js - MongoDB连接

django - 使用 mongodb 的 django 和谷歌地图的 GIS 应用程序

c# - 分析 C# 应用程序转储文件

c# - 我应该使用 BlobContainerClient 还是 BlobClient 还是两者都使用?

javascript - $.getJSON 解析器错误尝试调用 API

java - MongoDb 多重排序

c# - 使用 DrawingContext 在 Canvas 上的元素上绘图

c# - ASP.NET Web 应用程序(.NET 框架)中的 asp.net core SignalR 配置

java - 在 Rest 服务中返回动态 Json