如何使用mongodb c#驱动程序更新除ID外的整个文档

时间:2018-10-02 11:06:00

标签: c# mongodb asp.net-web-api mongodb-.net-driver

此刻我正在更新整个文档,但是如果ID更改,我会收到错误消息:

  

MongoDB.Driver.MongoWriteException:'写操作导致错误。     应用更新后,发现(不可变)字段“ _id”已更改为_id:BinData(3,B3FD0EE0FF161845BE96BE40A7DDE84B)'

所以我希望它在更新文档时忽略ID字段。

这就是我现在正在做的事情:

 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 :(得分:2)

将'BsonIgnoreIfDefault'属性添加到InternalId属性。

public class Document
{
    [BsonId]       
    [BsonIgnoreIfDefault]
    public ObjectId InternalId { get; set; }
    // rest of document
}

答案 1 :(得分:1)

发生的问题是,如果使用ReplaceOneAsync,则在过滤器或替换文档中未指定的话,MongoDB会将_id字段添加到替换文档中。如果两者都存在_id,则值必须相等。但是,如果我能正确理解您的代码,则尝试通过ID查找文档并将其替换。如果您是我会使用的一个称为FindOneAndReplace()或FindOneAndReplaceAsync()的收集方法。您可能想查看一下MongoDB文档:

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

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

希望这对您有帮助!