所以我看到很多人都有这个问题,但所有这些似乎都是针对较旧的驱动程序版本而且解决方案对我不起作用。基本上,当我使用新对象(无Id)运行ReplaceOneAsync(...)
时,它会被插入,但没有ID。最流行的答案是将[BsonIgnoreIfDefault]
添加到文档的Id属性中,以便序列化程序不认为它已设置,这对我不起作用。这是基类:
[BsonIgnoreExtraElements(Inherited = true)]
public abstract class MongoEntity : IMongoEntity
{
[BsonRepresentation(BsonType.ObjectId)]
[BsonIgnoreIfDefault]
public string Id { get; set; }
}
upsert方法:
public async Task<T> UpsertAsync(T entity)
{
var filter = Builders<T>.Filter.Eq(x => x.Id, entity.Id);
await _collection.ReplaceOneAsync(
filter,
entity,
new UpdateOptions { IsUpsert = true });
return entity;
}
有什么想法吗?
MongoDB.Driver版本2.4.1.18
答案 0 :(得分:0)
我知道旧问题,但对于仍然遇到此问题的任何人:
Per the official issue here, 如果您的过滤器包含ID作为参数,那么当过滤器未找到文档时,该ID设置为00000000000,显然,使用[BsonIgnoreIfDefault]并不能阻止该操作通过设计。
这意味着,如果您希望更新功能通过_id查找文档,然后将其插入(如果不存在),那太糟糕了。
幸运的是,对于我的用例,除了ID之外,永远不会有完全相同的文档,因此我能够按文档上的其他值进行过滤(这仍然需要[BsonIgnoreIfDefault]属性),但是显然小于理想。
希望这会有所帮助。