我收集了一些信息:
{
messageid: ObjectId
userid: ObjectId
message: string
isread: true|false
}
以及每个用户的消息计数集合:
{
userid: ObjectId
total: int
unread: int
}
当我从“messages”集合中删除消息时,我还需要减少“counts”集合中的“total”,并有条件地(如果“messages.isread”==false)减少“unread”字段。
为此,我需要首先检索teh消息,检查其“isread”字段,然后更新计数。有可能在这些操作之间将邮件标记为已读,然后我将错误地减少“未读”计数。
有没有一种方法可以根据一次拍摄中其他采集的结果有条件地更改一个采集中的某些内容?
最佳答案
这里有很多答案,但我想在这里填写所有的空白:
MongoDB中有没有任何方法可以自动更新两个集合?
不,两个集合的原子更新实际上是一个事务。MongoDB不支持跨集合甚至集合内的事务。
MongoDB提供的several modifiers在单个文档上是原子的。因此,您可以一次增加几个不同的变量($inc
)。虽然这里有一些限制,但不能对单个属性执行两个不同的操作。
有没有一种方法可以根据一次拍摄中其他采集的结果有条件地更改一个采集中的某些内容?
一般来说,这里有一些关于atomic updates的文档。但是,您真正需要的是一个队列和某种形式的two-phase commit或者您需要触发器。
触发器具有not yet been implemented,因此在您的情况下,它实际上不是一个选项。
有可能在这些操作之间将邮件标记为已读,然后我将错误地减少“未读”计数。
在这一点上,您有两种不同的策略,可以使这个行为具有某种程度的一致性。坦率地说,根据您的描述,您可能需要调查构建一个简单的队列来更新您的总数。
关于concurrency - 有没有办法以原子方式更新MongoDB中的两个集合?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6090212/