mongodb

时间:2016-04-29 09:08:48

标签: mongodb

我正在尝试创建一个应该保存版本化数据的集合(为简单起见,只是一条消息)。

对于每封邮件,都有一个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

要求

我想创建一个解决方案:

  1. 适用于尝试创建同一文档的多个版本的并发请求。这意味着我希望每个链接都有一个唯一的version
  2. 满足MongoDB Data Model Design best practices
  3. 可能的解决方案

    为了确保每个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术语创建一个“增长”的文档,所以应该避免使用。

1 个答案:

答案 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 - 然后做一个将删除第一个条目的工作(类似于上限集合 - 但在这种情况下是上限数组)

  

修改

please find discussion

如果您排序的字段始终是唯一的,那么有一个边缘情况,然后它无法保证(至少无法澄清)返回的订单永远都是一样的。