如何编写通用 ASP.NET Core ApiController 以从客户端执行 MongoDB CRUD 操作?

How to write a Generic ASP.NET Core ApiController to do MongoDB CRUD operations from Client Side?

如何编写通用 ASP.NET Core ApiController 以从 Angular/React.

等客户端框架执行 MongoDB CRUD 操作

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

您可以创建一个包含对象(或集合)名称、操作(InsertReplaceDelete 或您想要支持的任何其他内容的请求负载定义) 和对象本身。将 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();
}

或者,为了使操作符合 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();
}