@DocumentReference(lazy=true)Spring数据mongo是否存在N+1问题



我有这样的型号

@Data
@NoArgsConstructor
@Document 
public class Parent {
@Id
String id;
String name;
@DocumentReference(lazy = true)
List<Child> children;
}
@Data
@NoArgsConstructor
@Document
public class Child {
@Id
String id;
String name;
}

我只为他们两个提供了通常的MongoRepository。我还启用了日志

logging.level.org.springframework.data.mongodb.core.MongoTemplate=DEBUG

如果我使用List<Parent> parents = parentRepo.findAll()只选择Parents,我只向数据库发出一个请求,并在日志中看到:

find using query: {} fields: Document{{}} for class: class com.test.Parent in collection: parent

我通过调试来查看它,我看到孩子们的集合是代理的,它只包含id。这是合理的。但是,如果我决定由孩子们迭代呢?

public void test() {
List<Parent> parents = parentRepo.findAll();
parents.get(0).getChildren().forEach(child -> System.out.println(child));
}

我在日志中仍然只看到一个对数据库的请求,但不止一个。有多少人?是否存在n+1问题?我如何查看对数据库的所有请求,包括使用@DocumentReference(lazy=true(加载数据

我还遇到了对引用表的查询不会出现在日志中的问题。

我发现Spring Data MongoDB中还有另一个类负责处理对引用表的请求。

在这里写下这件事。

要在查询引用集合时启用日志记录,请添加以下属性:

logging.level.org.springframework.data.mongodb.core.convert.MongoDatabaseFactoryReferenceLoader=TRACE

最新更新