【发布时间】:2021-02-17 09:17:51
【问题描述】:
我在尝试时遇到问题,归结为增加文档中的字段或插入整个文档。上下文是“尝试为序列插入初始文档或增加现有序列的序列号”。
这段代码:
private async Task<int> GetSequenceNumber(string sequenceName)
{
var filter = new ExpressionFilterDefinition<Sequence>(x => x.Id == sequenceName);
var builder = Builders<Sequence>.Update;
var update = builder
.SetOnInsert(x => x.CurrentValue, 1000)
.Inc(x => x.CurrentValue, 1);
var sequence = await _context.SequenceNumbers.FindOneAndUpdateAsync(
filter,
update,
new FindOneAndUpdateOptions<Sequence>
{
IsUpsert = true,
ReturnDocument = ReturnDocument.After,
});
return sequence.CurrentValue;
}
导致异常
MongoDB.Driver.MongoCommandException:命令 findAndModify 失败:更新路径“currentvalue”会在“currentvalue”处产生冲突。 在 MongoDB.Driver.Core.WireProtocol.CommandUsingCommandMessageWireProtocol`1.ProcessResponse(ConnectionId connectionId, CommandMessage responseMessage)
删除 SetOnInsert 不会导致错误,但会插入一个 currentValue 等于 1 而不是预期的 1000 的文档。
如果SetOnInsert 没有被兑现,它几乎会出现,并且正在发生的事情是插入默认文档然后 currentValue 通过Inc 原子地递增为新文档已创建。
如何克服这些问题?非 C# 解决方案也将受到欢迎,因为我可以翻译...
【问题讨论】:
-
这是一个服务器限制,见这里stackoverflow.com/questions/50947772/…
标签: c# mongodb mongodb-.net-driver upsert