我正在尝试创建一个应该保存版本化数据的集合(为简单起见,只是一条消息)。
对于每封邮件,都有一个link
,可以访问该邮件:
{
link: 'A57awpO3e',
message: 'foo',
version: 1
}
/message/A57awpO3e -> foo
假设我们根据上一条消息再创建两条消息:
{
link: 'A57awpO3e',
message: 'bar',
version: 2
},
{
link: 'A57awpO3e',
message: 'baz',
version: 3
}
请求返回此消息的第3版:
/message/A57awpO3e/3 -> baz
我想创建一个解决方案:
version
。为了确保每个version
link
个数字是唯一的,这必须是原子更新,它会读取最大版本并创建新文档并修改版本。
我提出的最好的方法是将系列重组为如下所示:
{
link: 'A57awpO3e',
maxVersion: 3,
messages: [
{
message: 'foo',
version: 1
},
{
message: 'bar',
version: 2
},
{
message: 'baz',
version: 3
}
]
}
所以我可以这样做:
data.findAndModify({
query: { 'link': 'A57awpO3e' },
update: {
$inc: { maxVersion: 1 }
$push: {
'messages': {
message: 'foo bar',
version: maxVersion
}
}
},
new: true
});
问题是我不知道如何在这一点上访问maxVersion,这个解决方案会用MongoDB术语创建一个“增长”的文档,所以应该避免使用。
答案 0 :(得分:1)
Mongo不支持身份种子(如oracle或mssql), 为了简化这个问题 - 也许消息可以存储在数组内部?
message: [
{msg:"my message", dateTime:2016-04-29 11:22:45.9950},
{msg:"your message", dateTime:2016-04-29 11:22:46.0110}
]
$ push -ing一个项目总是将它添加到数组的末尾,然后你可以通过消息的数组索引得到版本?
要获取最后一条消息,请使用$ slice:-1
为了避免挖掘数据结构 - 如果您需要拥有所有版本 - 数据需要增长。如果你可以保留最后的n - 然后做一个将删除第一个条目的工作(类似于上限集合 - 但在这种情况下是上限数组)
修改
如果您排序的字段始终是唯一的,那么有一个边缘情况,然后它无法保证(至少无法澄清)返回的订单永远都是一样的。