如何编写一个通用的ASP.NET核心ApiController来从客户端执行MongoDB CRUD操作?

如何编写一个通用的ASP.NET核心ApiController来从客户端执行MongoDB CRUD操作?,mongodb,asp.net-core,mongodb-.net-driver,generic-programming,webapi,Mongodb,Asp.net Core,Mongodb .net Driver,Generic Programming,Webapi,如何编写一个通用的ASP.NET核心ApiController,从客户端框架(如Angular/React)执行MongoDB CRUD操作 注意:Firebase为firestore和数据库提供了这样的客户端库您可以创建一个请求负载定义,该定义将包含对象(或集合)名称、操作(插入、替换、删除或任何其他您想要支持的内容)和对象本身。将mongo数据库对象注入控制器,按名称获取集合并应用该操作。伪代码可能如下所示: class Operation { OperationType Type

如何编写一个通用的ASP.NET核心ApiController,从客户端框架(如Angular/React)执行MongoDB CRUD操作


注意:Firebase为firestore和数据库提供了这样的客户端库

您可以创建一个请求负载定义,该定义将包含对象(或集合)名称、操作(
插入
替换
删除
或任何其他您想要支持的内容)和对象本身。将mongo数据库对象注入控制器,按名称获取集合并应用该操作。伪代码可能如下所示:

class Operation
{
    OperationType Type {get; set;}
    JObject Object {get; set;}
    string ObjectId {get; set;}
    string ObjectName {get; set;}
}

[HttpPost]
public async Task<IActionResult> Apply(Operation operation)
{
    WriteModel<BsonDocument> model = null;

    switch (operation.Type)
    {
        case OperationType.Insert:
            model = new InsertOneModel(ConvertToBsonDocument(operation.Object));
            break;
        case OperationType.Replace:
            model = new ReplaceOneModel(operation.ObjectId, ConvertToBsonDocument(operation.Object));
            break;
        case OperationType.Delete:
            model = new DeleteOneModel(operation.ObjectId);
            break;
    }

    await mongoDatabase.GetCollection<BsonDocument>(operation.ObjectName).BultWriteAsync(new[] {model});

    return Ok();
}
类操作
{
OperationType类型{get;set;}
JObject对象{get;set;}
字符串ObjectId{get;set;}
字符串ObjectName{get;set;}
}
[HttpPost]
公共异步任务应用(操作)
{
WriteModel模型=null;
开关(操作类型)
{
案例操作类型。插入:
model=newinsertonemodel(ConvertToBsonDocument(operation.Object));
打破
外壳操作类型。更换:
model=newreplaceonemodel(operation.ObjectId,ConvertToBsonDocument(operation.Object));
打破
案例操作类型。删除:
model=新的DeleteOneModel(operation.ObjectId);
打破
}
等待mongoDatabase.GetCollection(operation.ObjectName).BultWriteAsync(新[]{model});
返回Ok();
}
或者,为了使操作与http规范保持一致并实现更好的分离,您可以将逻辑拆分为多个操作:

[HttpGet("{name}/{objectId}")]
public async Task<IActionResult> Get(string name, string objectId)
{
    var document = await mongoDatabase.GetCollection<BsonDocument>(name).Find(new BsonDocument("_id", ObjectId.Parse(objectId))).FirstOrDefaultAsync();

    var dotNetObj = BsonTypeMapper.MapToDotNetValue(document);
    var json = JsonConvert.SerializeObject(dotNetObj);

    return document is null
        ? NotFound()
        : (IActionResult)Content(json, "application/json");
}


[HttpPost("{name}")]
public async Task<IActionResult> Post(string name, JsonElement @object)
{
    await mongoDatabase.GetCollection<BsonDocument>(name).InsertOneAsync(ConvertToBsonDocument(operation.Object));
    return Ok();
}

[HttpPut("{name}/{objectId}")]
public async Task<IActionResult> Put(string name, string objectId, JsonElement @object)
{
    await mongoDatabase.GetCollection<BsonDocument>(name).ReplaceOneAsync(new BsonDocument("_id", ObjectId.Parse(objectId), ConvertToBsonDocument(operation.Object));
    return Ok();
}

[HttpDelete("{name}/{objectId}")]
public async Task<IActionResult> Delete(string name, string objectId)
{
    await mongoDatabase.GetCollection<BsonDocument>(name).DeleteOneAsync(new BsonDocument("_id", ObjectId.Parse(objectId));
    return Ok();
}
[HttpGet(“{name}/{objectId}”)]
公共异步任务Get(字符串名称、字符串对象ID)
{
var document=await mongoDatabase.GetCollection(name).Find(新的BsonDocument(“\u id”,ObjectId.Parse(ObjectId))).FirstOrDefaultAsync();
var dotNetObj=BsonTypeMapper.MapToDotNetValue(文档);
var json=JsonConvert.SerializeObject(dotNetObj);
退货单据为空
?未找到()
:(IActionResult)内容(json,“应用程序/json”);
}
[HttpPost(“{name}”)]
公共异步任务Post(字符串名称,JsonElement@object)
{
等待mongoDatabase.GetCollection(name.InsertOneAsync(ConvertToBsonDocument(operation.Object));
返回Ok();
}
[HttpPut(“{name}/{objectId}”)]
公共异步任务Put(字符串名称、字符串objectId、JsonElement@object)
{
等待mongoDatabase.GetCollection.ReplaceOneAsync(新的BsonDocument(“\u id”,ObjectId.Parse(ObjectId),ConvertToBsonDocument(operation.Object));
返回Ok();
}
[HttpDelete(“{name}/{objectId}”)]
公共异步任务删除(字符串名称、字符串对象ID)
{
等待mongoDatabase.GetCollection.DeleteOneAsync(新的BsonDocument(“_id”,ObjectId.Parse(ObjectId));
返回Ok();
}

我尝试了[HttpGet(“{resource}”)],[HttpGet(“{resource}/{id?}”)]为了获得ALL和GETBYID并试图返回BSONDOWS文档,但是得到了解析错误Error <代码> NethOpth.JSON/COD>,我应该已经明确地提到了。您也可以考虑<代码> JSONDOCT/<代码>。@ KISHORHASASANAMAN,我已经更新了我的答案以支持ID请求的简单get。您还可以支持一些过滤和翻译。into mongo查询过滤器,虽然这将是一个更高级的逻辑,并取决于需求。是的,我的错。我已经用
.FirstOrDefaultAsync()
更新了答案,使其更正确。是的,内置json转换器似乎没有提供有效的json。请按照此答案中的建议尝试使用Newtonsoft.json。