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

时间:2017-07-13 06:41:26

标签: java spring mongodb spring-boot morphia

TL; DR

使用Morphia ORM,每次列表(子文档)的元素(多个元素)发生更改时,是否应该使用save(entity / doc),或者使用update-operations更新只更新已更改的元素?

背景/方案

我在 qa (QuestionAnswer)子文档中有以下文档(考试)(可以在 50-100 条目之间增长)。考虑到以下因素:

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

    {
        "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& amp ;; Morphia以下列方式(只是为了给出一个想法)

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

    问题

    使用 Morphia ORM ,每次列表元素(子文档)更改或使用更新时,是否应使用保存(实体/文档) - 操作只更新已​​更改的元素?

    • 如果我使用保存,请考虑 80%频率。 (如上所述)经常重新保存整个实体是否有效?
    • 如果我使用更新,那么执行 x 更新调用的次数是有效的,其中x是要求更新的问题数(subdoc的元素)(每个问题与差异。因此,差异查询条款)?
    • 哪个效果最好?
    • 由于 qa 子文档会经常更新并且特定于文档(不共享),我还能如何对此进行建模以使更新子目录的元素无痛,在进行良好实践的同时,是否有效且可扩展?

1 个答案:

答案 0 :(得分:0)

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

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