我具有以下模式的嵌入式消息数组
{
"_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楼,但我都无法提供帮助,分成数组,但这显然是不可能的。
当前,如果不重新设计架构并将消息放入单独的集合中,然后再进行升级,我将无法解决此问题。
我某种程度上需要按顺序执行此操作,以确保维持正确的顺序。
任何例子或阅读材料将不胜感激。