gpt4 book ai didi

c# - 当我使用 ReplaceOneAsync 和 IsUpsert = true 时,mongodb 添加了一个空 ID。我该如何阻止呢?

转载 作者:可可西里 更新时间:2023-11-01 09:40:34 24 4
gpt4 key购买 nike

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

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

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

我做错了什么可以为新记录生成 ObjectId

最佳答案

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

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

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

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

MongoDB API 提出了两种方法:
1) ReplaceOneAsync 返回具有 UpsertedId 属性的 ReplaceOneResult

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);

关于c# - 当我使用 ReplaceOneAsync 和 IsUpsert = true 时,mongodb 添加了一个空 ID。我该如何阻止呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34573234/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com