如果文档存在,我可以使用以下命令更新该文档

var filter = Builders<Neighborhood>.Filter.Eq(x => x.Id, neighborhood.Id);

var result = await collection.ReplaceOneAsync(filter,
             neighborhood,new UpdateOptions { IsUpsert = true });


[CollectionName("neighborhoods")]
[BsonIgnoreExtraElements(true)]
public class Neighborhood : IEntity<string>
{
 [BsonId(IdGenerator = typeof(GuidGenerator))]
 [BsonRepresentation(BsonType.ObjectId)]
 public string Id { get; set; }

 [BsonElement("name")]
 public string  Name    { get; set; }
}

如果id=null并且我想返回更新的结果,如何插入文档。
当插入一个新的文档空id时,用空id创建一个记录,我添加了[bsonid(idgenerator=typeof(guidgenerator))]没有任何运气。
我做错了什么,这样就可以为新记录生成objectid。

最佳答案

司机认为身份证已经填好了。您需要为id字段添加允许驱动程序生成新id的设置。
有两种方法:
[BsonIgnoreIfDefault]模型中添加属性Neighborhood
代码中的设置

BsonClassMap.RegisterClassMap<Neighborhood>(x =>
{
    x.AutoMap();
    x.GetMemberMap(m => m.Id).SetIgnoreIfDefault(true);
});

我更喜欢第二种方法,因为您不需要添加对MongoDB的引用。
MongoDB API提出了两种方法:
1)ReplaceOneAsync返回具有ReplaceOneResult属性的UpsertedId
var filter = Builders<Neighborhood>.Filter.Where(x => x.Name == "somthing");
var replaceResult = await collection.ReplaceOneAsync(filter, entity, new UpdateOptions { IsUpsert = true });
return replaceResult.UpsertedId;

2)FindOneAndReplaceAsync允许您选择所需内容-更改前或更改后的实体。为了完成我们的任务
var filter = Builders<Neighborhood>.Filter.Where(x => x.Name == "somthing");
var options = new FindOneAndReplaceOptions<Neighborhood, Neighborhood>
  {
     IsUpsert = true,
     ReturnDocument = ReturnDocument.After
  };
var updatedEntity = await collection.FindOneAndReplaceAsync(filter, entity, options);

07-28 02:40
查看更多