Перезаписать данные, связанные с конкретным ObjectId? - PullRequest
0 голосов
/ 04 июня 2018

Я пытаюсь изменить «OriginalUrl», который уже создан и сохранен в базе данных под случайным ObjectId, следующим образом:

{
    "_id" : ObjectId("5b1551d571231d26444d5c35"),
    "Title" : "Test5",
    "Code" : "n3b4nb_jxnm2",
    "OriginalUrl" : "https://docs.microsoft.com/en-us/aspnet/core/tutorials/first-web-api-mac?view=aspnetcore-2.1",
    "Url" : null
}

У меня работает метод Post Get and Delete, но мой Putметод не делает то, что я понимаю, как способ сделать это в соответствии с https://docs.microsoft.com/

[HttpPut("{id}")]
        public async Task<IActionResult> Update(string id, [FromBody] string su)
        {
            var gameFromDb = await _repo.GetAsync(id);
            if (gameFromDb == null)
            {
                return new NotFoundResult();
            }

            su = gameFromDb;
           // await _repo.Update(su);
            return new OkObjectResult(su);
        }

Я все еще учусь, поэтому я искренне извиняюсь, если это очевидный ответ, который я еще не обнаружил в этомсайт или где-либо еще.

Обновление:

        [HttpPut("{id}")]
        public async Task<IActionResult> Update(string id, [FromBody] string su)
        {
            return (await _repo.Update(ObjectId.Parse(id)))
                ? (IActionResult)Ok("Updated Successfully")
                : NotFound();
        }
    }
}

Репозиторий:

public async Task<bool> Update(ObjectId id)
{
    var filter = new ShortUrl("_id", 10);
    var replacement = new BsonDocument { { "_id", 10 }, { "x", 2 } };

    var r = _db.Urls.ReplaceOne(filter, replacement);
    return r.IsAcknowledged

}

Обновление:

Я понимаю, что есть похожие статьи, такие как:

https://stackoverflow.com/questions/41493327

И:

https://stackoverflow.com/questions/41483648

Но ни одна из них не помогла.Я не хочу жестко кодировать «Имя», «Джон» в «Имя», «Джек».Мне нужно иметь возможность искать идентификатор, связанный с «Джоном», и менять имя на то, что когда-либо пропускает пользователь.Я думал примерно так:

public async Task<bool> Update(ObjectId id)
        {
var filter = Builders<ShortUrl>.Filter.Eq(x => x.Id, id);
var r = await _db.UrlsFindOneAndUpdate(filter, update);
return r.IsAcknowledged;
}

, но, очевидно, это неправильно.Любая обратная связь будет принята с благодарностью.

1 Ответ

0 голосов
/ 07 июня 2018

Я не нашел абсолютно ничего полезного, помогая мне решить эту проблему, но в конце концов я заставил это работать:

Класс контроллера:

public async Task<IActionResult> Update(string id, [FromBody]ShortUrl entity)
        {                 
            if (await _repo.Update(id, entity))
            {
                return Ok();
            }

            return NotFound();
        }
    }

Класс репозитория:

   public async Task<bool> Update(string Id, ShortUrl shortUrl)
    {
      var objId = ObjectId.Parse(Id);

        var ub = Builders<ShortUrl>.Update;

        var updates = new List<UpdateDefinition<ShortUrl>>();

        if (!string.IsNullOrWhiteSpace(shortUrl.Title))
        {
            updates.Add(
                ub.Set(x => x.Title, shortUrl.Title));
        }

        if (!string.IsNullOrWhiteSpace(shortUrl.OriginalUrl))
        {
            updates.Add(
                ub.Set(x=>x.OriginalUrl,shortUrl.OriginalUrl));
        }

        if (updates.Count == 0) return false;

       var result = await _db.Urls.UpdateOneAsync(
            x => x.Id == objId,
            ub.Combine(updates));

        return result.ModifiedCount > 0;
...