当我使用 ReplaceOneAsync 和 IsUpsert = true mongodb 添加一个空 ID。我该如何阻止呢?
When I use ReplaceOneAsync and IsUpsert = true mongodb add's a null Id. How do I stop this?
如果文档存在,我可以使用以下方法更新文档
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 并且我想 return 更新结果,如何插入文档。
插入新文档时 NULL
ID,使用 NULL
ID 创建记录,我添加 [BsonId(IdGenerator = typeof(GuidGenerator))]
没有任何运气。
我做错了什么所以可以为新记录生成 ObjectId
。
C# Driver 认为 Id 已经填满。您需要为 Id 字段添加设置,以允许驱动程序生成新的 Id。
有两种方法:
- 在您的
Neighborhood
模型中添加属性 [BsonIgnoreIfDefault]
。
在代码中设置
BsonClassMap.RegisterClassMap<Neighborhood>(x =>
{
x.AutoMap();
x.GetMemberMap(m => m.Id).SetIgnoreIfDefault(true);
});
我更喜欢第二种方法,因为您不需要添加对 MongoDB.
的引用
MongoDB API 提出两种方法:
1) ReplaceOneAsync
returns 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
允许您 select 您想要的 - 更改之前或之后的实体。对于我们的任务,我们需要 after
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);
如果文档存在,我可以使用以下方法更新文档
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 并且我想 return 更新结果,如何插入文档。
插入新文档时 NULL
ID,使用 NULL
ID 创建记录,我添加 [BsonId(IdGenerator = typeof(GuidGenerator))]
没有任何运气。
我做错了什么所以可以为新记录生成 ObjectId
。
C# Driver 认为 Id 已经填满。您需要为 Id 字段添加设置,以允许驱动程序生成新的 Id。
有两种方法:
- 在您的
Neighborhood
模型中添加属性[BsonIgnoreIfDefault]
。 在代码中设置
BsonClassMap.RegisterClassMap<Neighborhood>(x => { x.AutoMap(); x.GetMemberMap(m => m.Id).SetIgnoreIfDefault(true); });
我更喜欢第二种方法,因为您不需要添加对 MongoDB.
的引用MongoDB API 提出两种方法:
1) ReplaceOneAsync
returns 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
允许您 select 您想要的 - 更改之前或之后的实体。对于我们的任务,我们需要 after
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);