我应该使用 save or update 来使用 Morphia 更新 Mongodb 中嵌入文档的一个或多个元素



TL;博士

使用Morphia ORM,我应该在每次列表(子文档(的元素(多个元素(更改时使用 save(实体/文档(还是使用更新操作的更新来仅更新更改的元素?

背景/场景

我有以下文档(考试(和qa(问答(子文档(可以在50-100个条目之间增长(。考虑到以下几点:

  1. 大约 80% 的操作是一次更新qa子文档的多个条目
  2. 记录(考试(特定于用户,因此没有并发更新
  3. 一个屏幕显示5-10个问题,当用户移动到下一个/上一页时,当前屏幕上的问题将被发布到服务器进行更新
  4. 问题答案特定于考试记录

文档(只是为了给出一个想法(

{
"user": "user-record-ref",
"name": "some-name", 
"dob": "some-timestamp", 
"qa": [
{
"question": "some-question1", 
"choices": ["A", "B"],
"answer": ["A"]
...
},
{
"question": "some-question2", 
"choices": [],
"answer": ["descriptive-answer"]
...
}
]
}

我使用Spring Boot和Morphia以以下方式对上述内容进行了建模(只是为了给出一个想法(

public class Exam {
private String name; 
private Date dob;
@Reference
private User user;  
@Embedded
List<QuestionAnswer> qa;  
}

问题

使用Morphia ORM,我应该在每次列表(子文档(的元素更改时使用save(实体/文档(还是使用更新操作的更新来仅更新更改的元素?

  • 如果我使用保存,考虑到80% 的频率(如上所述(,经常重新保存整个实体是否有效?
  • 如果我要使用更新,执行 x 次更新调用是否有效,其中x是请求更新的问题(子文档的元素(的数量(每个问题都有差异 id,因此,差异查询子句(?
  • 哪个性能最高?
  • 由于qa子文档会经常更新并且特定于文档(不共享(,因此我还能如何对此进行建模,以便在实践良好实践的同时轻松、高效和可扩展地更新子文档的元素?

我认为保存方法是一种简单的编码方法。向后端发送更新调用总是更有效,因为它减少了通过线路的流量并减少了磁盘上更改的数据量。如果您信任您的数据库,您还可以将写入关注点设置为甚至不等待保存 - 也许应用程序响应非常快。

但是,由于您对此特定的 QA 子文档进行了大量更改,因此我会考虑将 QA 保存在其自己的集合中。这是您可以在QA对象本身上调用save,而不必担心在每次调用时将其余的用户数据发送到服务器。

最新更新