首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >核心+ MongoDb -如何通过“代码”搜索数据库并返回原始url?

核心+ MongoDb -如何通过“代码”搜索数据库并返回原始url?
EN

Stack Overflow用户
提问于 2018-06-09 02:51:17
回答 2查看 651关注 0票数 -1

我不确定如何搜索存储在我的数据库中的“代码”,以便返回"OriginalUrl“。我知道我可以搜索ObjectId,但我希望能够通过分配给该ObjectId的“代码”进行搜索。

目前,我有一个工作程序,它接受一个Url以及“标题”,并将其发送到数据库:

它被分配了一个Objectid代码和一个随机生成的12个字符的“_id”:

如果对有帮助,这是我的类:

代码语言:javascript
复制
    namespace ShortenUrls.Controllers
    {
        [Route("api/codes")]
        public class ShortUrlsController : Controller
        {
            private readonly ShortUrlRepository _repo;

            public ShortUrlsController(ShortUrlRepository repo)
            {
                _repo = repo;
            }

            [HttpGet("{id}")]
            public async Task<IActionResult> Get(string id)
            {
                var su = await _repo.GetAsync(id);

                if (su == null)
                    return NotFound();

                return Ok(su);
            }
            [HttpPost]
            public async Task<IActionResult> Create([FromBody] ShortUrl su)
            {
                await _repo.CreateAsync(su);
                return Ok(su);
            }
}

和Repository类:

代码语言:javascript
复制
namespace ShortenUrls.Models.Repository
{
public class ShortUrlRepository
{
    private const string alphabet = "23456789bcdfghjkmnpqrstvwxyz-_";

    private static readonly Random rand = new Random();

    private readonly Database _db;

    public ShortUrlRepository(Database db)
    {
        _db = db;
    }

    private static string GenerateCode()
    {
        const int codeLength = 12;

        var chars = new char[codeLength];

        for (var i = 0; i < codeLength; i++)
        {
            chars[i] = alphabet[rand.Next(0, alphabet.Length)];
        }

        return new string(chars);
    }


    public Task<ShortUrl> GetAsync(string id)
    {
        var objId = ObjectId.Parse(id);

        return _db.Urls.Find(x => x.Id == objId).FirstOrDefaultAsync();
    }

    public Task CreateAsync(ShortUrl su)
    {
        su.Code = GenerateCode();
        return _db.Urls.InsertOneAsync(su);
    }
}
EN

回答 2

Stack Overflow用户

发布于 2018-06-09 05:17:07

只需使用过滤器即可。这样做可以让你创建一个专门针对“代码”的查询。

代码语言:javascript
复制
public async Task<ShortUrl> GetAsync(string code)
{
    var filterBuilder = new FilterDefinitionBuilder<ShortUrl>();
    var filter = filterBuilder.Eq(s => s.Code, code);
    var cursor = await _db.Urls.FindAsync(filter);
    return await cursor.FirstOrDefaultAsync();
}
票数 0
EN

Stack Overflow用户

发布于 2018-06-09 10:15:59

假设您已经知道调用此函数时的代码,并且在InsertOneAsync调用时创建了ObjectId。首先,更改您的存储库,将Code作为可搜索的输入。

代码语言:javascript
复制
public Task<ShortUrl> GetAsync(string code)
{
    return await _db.Urls.FirstOrDefaultAsync(x => x.Code == code);
}

然后将您的控制器Get更改为:

代码语言:javascript
复制
[HttpGet("{code}")]
public async Task<IActionResult> Get(string code)
{
    var su = await _repo.GetAsync(code);

    if (su == null)
        return NotFound();

     return Ok(su);
}

在您的控制器中,如果您只需要在获取对象后返回su.OriginalUrl,则可以访问它。

然后在邮递员中,你可以直接调用http://localhost:51767/api/codes?code=cmg3fjjr_gtv

请记住,在Startup.cs中通过默认路由设置的默认url参数仅适用于Id

代码语言:javascript
复制
app.UseMvc(routes => { /*...*/ })

所以这是行不通的:/api/codes/cmg3fjjr_gtv,除非你专门设置了路由或者把{code}改回了{id}。不过,代码的可读性会受到影响。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50766806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档