如何编写通用 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 和数据库提供这样的客户端库
您可以创建一个包含对象(或集合)名称、操作(Insert
、Replace
、Delete
或您想要支持的任何其他内容的请求负载定义) 和对象本身。将 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();
}
如何编写通用 ASP.NET Core ApiController 以从 Angular/React.
等客户端框架执行 MongoDB CRUD 操作注意:Firebase 为 firestore 和数据库提供这样的客户端库
您可以创建一个包含对象(或集合)名称、操作(Insert
、Replace
、Delete
或您想要支持的任何其他内容的请求负载定义) 和对象本身。将 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();
}