在ASP.NET Core Web API中实现MongoDB一对多关联及推文查询
在ASP.NET Core Web API中通过用户名查询用户所有推文
1. 安装MongoDB驱动
确保项目中安装MongoDB官方驱动包:
Install-Package MongoDB.Driver
也可通过NuGet包管理器搜索MongoDB.Driver完成安装。
2. 配置MongoDB连接
在appsettings.json中添加连接字符串与数据库名称:
{ "MongoDB": { "ConnectionString": "mongodb://localhost:27017", "DatabaseName": "TweetDB" } }
在Program.cs中注册MongoDB服务到依赖注入容器:
using MongoDB.Driver; var builder = WebApplication.CreateBuilder(args); // 注册MongoDB客户端 builder.Services.AddSingleton<IMongoClient>(sp => { var config = builder.Configuration.GetSection("MongoDB"); var connectionString = config["ConnectionString"]; return new MongoClient(connectionString); }); // 注册MongoDB数据库实例 builder.Services.AddScoped(sp => { var client = sp.GetRequiredService<IMongoClient>(); var dbName = builder.Configuration.GetSection("MongoDB")["DatabaseName"]; return client.GetDatabase(dbName); }); // 注册推文仓储类 builder.Services.AddScoped<ITweetRepository, TweetRepository>(); // 添加控制器服务 builder.Services.AddControllers(); var app = builder.Build(); app.MapControllers(); app.Run();
3. 完善实体类(可选但推荐)
为让MongoDB正确映射Id字段,给实体类的Id属性添加MongoDB特性:
using MongoDB.Bson; using MongoDB.Bson.Serialization.Attributes; public class Tweet { [BsonId] [BsonRepresentation(BsonType.ObjectId)] public string Id { get; set; } public string TweetText { get; set; } public DateTime TweetTime { get; set; } public string Username { get; set; } } public class UserRegistration { [BsonId] [BsonRepresentation(BsonType.ObjectId)] public string Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public string Username { get; set; } public string Email { get; set; } }
4. 定义推文仓储类
创建仓储接口与实现类,封装MongoDB查询逻辑:
using MongoDB.Driver; public interface ITweetRepository { Task<List<Tweet>> GetTweetsByUsernameAsync(string username); } public class TweetRepository : ITweetRepository { private readonly IMongoCollection<Tweet> _tweets; public TweetRepository(IMongoDatabase database) { _tweets = database.GetCollection<Tweet>("Tweets"); } public async Task<List<Tweet>> GetTweetsByUsernameAsync(string username) { // 构建匹配Username的查询条件 var filter = Builders<Tweet>.Filter.Eq(t => t.Username, username); // 按发布时间倒序返回结果 return await _tweets.Find(filter).SortByDescending(t => t.TweetTime).ToListAsync(); } }
5. 编写API控制器
创建控制器暴露查询接口:
using Microsoft.AspNetCore.Mvc; [ApiController] [Route("api/[controller]")] public class TweetsController : ControllerBase { private readonly ITweetRepository _tweetRepository; public TweetsController(ITweetRepository tweetRepository) { _tweetRepository = tweetRepository; } [HttpGet("user/{username}")] public async Task<ActionResult<List<Tweet>>> GetUserTweets(string username) { var tweets = await _tweetRepository.GetTweetsByUsernameAsync(username); if (!tweets.Any()) { return NotFound($"未找到用户 {username} 的推文"); } return Ok(tweets); } }
测试接口
启动API后,可通过以下URL测试:
GET https://localhost:<端口号>/api/Tweets/user/yourUsername
内容的提问来源于stack exchange,提问作者Y Abhishake Kumar
相关产品推荐
相关产品推荐

