Как обновить весь документ, кроме ID, с помощью драйвера mongodb c # - PullRequest
0 голосов
/ 02 октября 2018

В настоящее время я обновляю весь документ, но если идентификатор изменяется, я получаю сообщение об ошибке:

MongoDB.Driver.MongoWriteException: 'Операция записи привела к ошибке.После применения обновления было обнаружено, что (неизменяемое) поле '_id' было изменено на _id: BinData (3, B3FD0EE0FF161845BE96BE40A7DDE84B) '

Поэтому я хочу, чтобы оно игнорировало поле идентификатора при обновлениидокумент.

Вот что я сейчас делаю:

 public async Task<bool> UpdateMatch(Guid id, Match match)
    {
            ReplaceOneResult actionResult
                = await _context.Match.ReplaceOneAsync(m => m.Id.Equals(id),
                match,
                new UpdateOptions { IsUpsert = true });

            return actionResult.IsAcknowledged && actionResult.ModifiedCount > 0;
    }

Заранее благодарен за помощь!

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Добавьте атрибут BsonIgnoreIfDefault в свойство InternalId.

public class Document
{
    [BsonId]       
    [BsonIgnoreIfDefault]
    public ObjectId InternalId { get; set; }
    // rest of document
}
0 голосов
/ 02 октября 2018

Проблема заключается в том, что MongoDB добавит поле _id в документ замены, если оно не указано ни в фильтре, ни в документах замены, если используется ReplaceOneAsync.Если _id присутствует в обоих, значения должны быть равны.Однако, если я правильно понимаю ваш код, вы пытаетесь найти документ по идентификатору и заменить его.Существует метод коллекции FindOneAndReplace () или FindOneAndReplaceAsync (), который я бы использовал на вашем месте.Вы можете проверить документацию MongoDB для этого:

https://docs.mongodb.com/manual/reference/method/db.collection.replaceOne/

https://docs.mongodb.com/manual/reference/method/db.collection.findOneAndReplace/

Надеюсь, это поможет вам!

...