Atomic if not exist then insert in Mongodb .Net driver(原子如果不存在,则插入MongoDB.Net驱动程序)
                            本文介绍了原子如果不存在,则插入MongoDB.Net驱动程序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
                        
                        问题描述
假设我有以下模型:
public class Person
{
    [BsonId]
    public Guid Id { get; set; }
    public string Name { get; set; }
    public string Title { get; set; }
    public DateTime ReceivedAt { get; set; }
}
并且我有N个线程执行"如果不存在则插入",如何确保只有一个线程在数据库中插入文档。
我尝试的是:
 void test(DBContext context)
    {
        var person = new Person() { Id = Guid.NewGuid(), Name = "name", Title = "title", ReceivedAt = DateTime.Now };
        Console.WriteLine(DateTime.Now);
        var update = Builders<Person>.Update.Combine(
              Builders<Person>.Update.SetOnInsert(y => y.Name, person.Name)
            , Builders<Person>.Update.SetOnInsert(y => y.Title, person.Title)
            , Builders<Person>.Update.SetOnInsert(y => y.ReceivedAt, person.ReceivedAt)
            , Builders<Person>.Update.SetOnInsert(y => y.Id, person.Id));
        var result = context.People.FindOneAndUpdateAsync<Person>(
            x => x.Title == person.Title && x.Name == person.Name && x.ReceivedAt > person.ReceivedAt - TimeSpan.FromSeconds(10),
            update,
            new FindOneAndUpdateOptions<Person>() { IsUpsert = true,ReturnDocument = ReturnDocument.Before}).GetAwaiter().GetResult();
        if (result?.Id != null)
        {
            Console.WriteLine("duplicate");
        }
        else
        {
            Console.WriteLine("first time");
        }
    }
并使用以下命令进行测试:
DBContext context = new DBContext ();
for (int i = 0; i < 10; i++)
  {
   Task.Run(() => test(context));
  }
但上面的代码将多个文档插入到集合中,似乎FindOneAndUpdateAsync不是原子的。
在MongoDB中,有没有办法实现只有一个线程将文档插入集合?
推荐答案
您需要唯一的索引。你的模型的目的是什么?您是想要一个人的一条记录,而接收时间是他们最后一次收到的时间,还是说这更像是每次他们收到一次就应该到达这里的事件? 在(名称,标题)或(名称,标题,接收日期)上创建唯一索引。 由于DateTime.Now将在运行时递增,因此在第二种情况下,您将第一次看到多个&。在第一种情况下,您应该将ReceivedAt从SetOnInsert更改为Just Set。
这篇关于原子如果不存在,则插入MongoDB.Net驱动程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
				 沃梦达教程
				
			本文标题为:原子如果不存在,则插入MongoDB.Net驱动程序
				
        
 
            
        
             猜你喜欢
        
	     - 在哪里可以找到使用中的C#/XML文档注释的好例子? 2022-01-01
 - Web Api 中的 Swagger .netcore 3.1,使用 swagger UI 设置日期时间格式 2022-01-01
 - 带有服务/守护程序应用程序的 Microsoft Graph CSharp SDK 和 OneDrive for Business - 配额方面返回 null 2022-01-01
 - C#MongoDB使用Builders查找派生对象 2022-09-04
 - C# 中多线程网络服务器的模式 2022-01-01
 - 良好实践:如何重用 .csproj 和 .sln 文件来为 CI 创建 2022-01-01
 - 如何用自己压缩一个 IEnumerable 2022-01-01
 - 输入按键事件处理程序 2022-01-01
 - MoreLinq maxBy vs LINQ max + where 2022-01-01
 - WebMatrix WebSecurity PasswordSalt 2022-01-01
 
						
						
						
						
						
				
				
				
				