如何使用 Spring 数据可扩展地将元素插入 MongoDB 中的集合字段?
How to insert an element to a collection field in MongoDB using Spring Data scalably?
假设我们有一个名为 Threads 的 MongoDB 集合,其中有一个用于回复原始 post 的类型化集合字段。
当用户点击回复时,我们希望创建一个新的 post 实例并将其附加到回复字段。它可以很容易地完成如下:
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 了解更多详情。
如果打算以这种方式存储数百万条回复,请至少记住文档最大值 size limit 并考虑可行的加载策略。
假设我们有一个名为 Threads 的 MongoDB 集合,其中有一个用于回复原始 post 的类型化集合字段。
当用户点击回复时,我们希望创建一个新的 post 实例并将其附加到回复字段。它可以很容易地完成如下:
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 了解更多详情。
如果打算以这种方式存储数百万条回复,请至少记住文档最大值 size limit 并考虑可行的加载策略。