使用MongoDb驱动程序插入和更新数组元素时的并发问题

时间:2019-06-27 17:51:53

标签: c# mongodb mongodb-.net-driver

我具有以下模式的嵌入式消息数组

{ 
"_id" : NumberInt(5), 
"CurrentOwnerId" : NumberInt(9), 
"LastSent" : ISODate("2019-06-21T11:57:32.861+0000"), 
"Messages" : [
    {
        "_id" : BinData(3, "nuC1iYTKtkGzSuv7pVHsKg=="), 
        "MessageContent" : "Hi There", 
        "Status" : "Pending", 
        "DateSent" : ISODate("2019-06-21T11:57:32.861+0000"), 
        "Method" : "Slack",
        "TimeStamp" : "Its Time to party!"
    }
 ]
}

我有一个要求,在插入时,我要检查数组中的上一条消息并删除时间戳,然后将新的消息追加到新消息中(用于前端)。像下面

{ 
"_id" : NumberInt(5), 
"CurrentOwnerId" : NumberInt(9), 
"LastSent" : ISODate("2019-06-21T11:57:32.861+0000"), 
"Messages" : [
    {
        "_id" : BinData(3, "nuC1iYTKtkGzSuv7pVHsKg=="), 
        "MessageContent" : "Hi There", 
        "Status" : "Pending", 
        "DateSent" : ISODate("2019-06-21T11:57:32.861+0000"), 
        "Method" : "Slack",
        "TimeStamp" : "" // Gone 
    }
      {
        "_id" : BinData(3, "nuC1iYTKtkGzSuv7pVHsKg=="), 
        "MessageContent" : "Hello Back", 
        "Status" : "Pending", 
        "DateSent" : ISODate("2019-06-21T11:58:32.861+0000"), 
        "Method" : "Slack",
        "TimeStamp" : "Its the new Time to party!" // New one 
    }
 ]
}

这就是我现在的代码

       var message = Message.CreateToContactMessage(messageType, content);
       var latestMessage = await _conversationRepository.FindLatestMessageByContactIdAsync(contactId);

        Message.DiscernTimeStampByRef(message, latestMessage);
        if (latestMessage == null)
        {
            //This means its the first message
            await _conversationRepository.InsertMessageAsync(contactId, message);
        }
        else
        {
            await _conversationRepository.UpdateMessage(contactId, latestMessage);
            await _conversationRepository.InsertMessageAsync(contactId, message);
        }

这在调试时一切正常,但在负载下,我们开始看到并发问题,例如由于更新和插入之间的竞争条件而导致时间戳设置不正确。

我使用会话和事务尝试了从拉,推相同的查询(mongo不喜欢)或添加然后删除(使用会话和事务)中实现的海市but楼,但我都无法提供帮助,分成数组,但这显然是不可能的。

当前,如果不重新设计架构并将消息放入单独的集合中,然后再进行升级,我将无法解决此问题。

我某种程度上需要按顺序执行此操作,以确保维持正确的顺序。

任何例子或阅读材料将不胜感激。

0 个答案:

没有答案