9

如果文档存在,我可以使用以下方法更新文档

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 并且我想返回更新的结果,如何插入文档。

插入新文档NULLID 时,创建了一个带有NULLID 的记录,我 [BsonId(IdGenerator = typeof(GuidGenerator))]没有任何运气就添加了。

我在做什么错所以ObjectId可以为新记录生成一个。

4

1 回答 1

8

C# Driver 认为 Id 已经被填满。您需要为允许驱动程序生成新 ID 的 ID 字段添加设置。
有两种方法:

  1. [BsonIgnoreIfDefault]Neighborhood模型中添加属性。
  2. 代码中的设置

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

我更喜欢第二种方法,因为您不需要添加对 MongoDB 的引用。

MongoDB API 提出了两种方法:
1)ReplaceOneAsync返回ReplaceOneResultUpsertedId属性的

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);
于 2016-01-04T18:08:50.043 回答