假设我们有一个名为Threads的MongoDB集合,其中有一个类型化的集合字段,用于回复原始帖子。
[当用户点击回复时,我们希望创建一个新的帖子实例,并将其附加到回复字段中。可以很容易地完成以下操作:
var thread = threadRepository.findById(threadId);
thread.getReplies().add(post);
threadRepository.save(thread);
但是出现一个问题,此解决方案是否可扩展?如果对该线程有100万个答复该怎么办?
我的主要问题是:它们都将被加载到内存中吗?
如果是的话,如果我们只想创建一个新的答复,那不是浪费吗?推荐的解决方案是什么?
如果所有答复都嵌套在thread
文档中,那么是的,除非您明确指定要通过@Query(fields=...)
装入的字段,否则它们将被装入内存。>
为了修改文档而不必将其加载到内存中,请考虑使用更新而不是替换操作。
Update update = new Update().push("replies", post); template.updateFirst(query(where("id").is(thread.id)), update, Thread.class)
使用
$push
,可以将项目附加到数组。请参阅MongoDB参考documentation了解更多详细信息。
如果打算以这种方式潜在地存储数百万个答复,那么请至少牢记Document max size limit,并考虑可行的加载策略。