如何与MongoDB正确互动

时间:2018-08-20 19:37:32

标签: mongodb odm

假设我们有以下对象代表错误跟踪系统中的一个任务:

Task - id: ObjectId - status: TaskStatus - history: []Action

ActionLog - timestamp: int - author: string - transition_from: TaskStatus - transition_to: TaskStatus

TaskStatus是一个枚举:(open | in_progress | resolved | closed)

我们将实现REST端点以更改任务状态。它应该:

  • 验证给定的过渡是可能的
  • 在历史记录字段中添加适当的操作日志条目

考虑到我使用MongoDB和golang,应该如何实现呢?我想使代码易于维护和测试。 有人可以推荐一些开源项目吗?我能找到的所有教程都集中在基础知识上,看起来并不像现实生活中的例子。

我能够自行确定两种截然不同的方法:

1。直接修改数据库

将修改映射到适当的MongoDb命令。那就是:

  • 使用查询来验证当前状态以查看过渡是否有效
  • 使用$ push原子操作将条目添加到“历史记录”字段

摘要:

  • (+)很好的表现
  • (-)实现与数据库紧密耦合(难以进行单元测试)
  • (-)复杂的要求可能需要非常复杂的查询(代码将变得难以阅读)
  • 如果要返回修改后的对象,则必须复制“域模型”上的更改(违反DRY规则)或从db加载修改后的对象(findAndUpdate-听起来像是计划)

2。类似于DDD的方式

将setStatus方法添加到Task类,该方法将处理所有必要的事情(状态验证,添加操作日志条目等)。 Hovewer,这需要首先从db获取对象,在内存中对其进行修改,然后保留新版本(替换旧版本)。为了处理并发问题,可以使用乐观锁定。我的问题是,如何将对象保存回数据库?我可以只是“倾销”所有字段并创建一个大的更新,还是会过大?我是否应该搜索某种可以跟踪更改的ODM,以便仅发送差异文件?

摘要:

  • (+)清晰代码,易于测试
  • (-)可能的性能问题?
  • (-)要求拥有设计良好的ODM库或坚持使用完整的对象转储来替换One / update

任何建议将不胜感激。预先谢谢你!

0 个答案:

没有答案