【发布时间】:2019-08-16 14:36:14
【问题描述】:
我正在使用 MongoDB 4 和 MongoDB .net 驱动程序 2.7.3。我想同时在集合中插入一个新文档,以便集合中应该只有一个文档。文档插入集合后(即设置sequenceValue为1),我们只需要更新文档(即将sequenceValue加1),而不需要再插入新的文档。
在这个名为“countersCollection”的集合中,新文档的结构是一个 Counter 类,如下所示:
public class Counter
{
[BsonId]
public ObjectId _id { get; set; }
public string name { get; set; }
public long sequenceValue {get;set;}
public DateTime date {get;set;}
}
我的代码是这样的:
Counter c = await this.countersCollection.AsQueryable().FirstOrDefaultAsync(x => x.name == counterName);
DateTime utcNow = DateTime.UtcNow;
if (c == null) // empty document
{
var options = new FindOneAndUpdateOptions<Counter, Counter>() {ReturnDocument = ReturnDocument.After, IsUpsert = true };
var filter = new FilterDefinitionBuilder<Counter>().Where(x => x.name == counterName);
var update = new UpdateDefinitionBuilder<Counter>().Set(x => x.sequenceValue, 1).Set(x => x.date, utcNow);
seq = await this.countersCollection.FindOneAndUpdateAsync<Counter>(filter, update, options);
}
以上代码在非并发环境下运行良好,但在并发环境下运行不佳。如果多个线程同时调用上述代码,可能会在 countersCollection 中创建多个计数器文档。
有没有办法让它同时工作。
谢谢。
【问题讨论】:
标签: c# .net mongodb concurrency