如何在使用Spring Data的MongoRepository和查询注解时显示查询?

58

我在spring boot中使用MongoRepository来访问mongo数据库:

public interface MongoReadRepository extends MongoRepository<User, String> {
    @Query(value = "{$where: 'this.name == ?0'}", count = true)
    public Long countName(String name);
}

它可能有效,但我想知道它所访问的MongoDB查询确切是什么。

该如何做呢?

我尝试在属性中添加以下配置:

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

不工作。

有人能帮忙吗?

7个回答

97

我在application.properties文件中添加以下行,并且它可以正常工作:

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

查询:

@Query("{$and: [{'$or' : [{ 'name': {$regex : ?0, $options: 'i'}}, {'description': {$regex : ?1, $options: 'i'}}]}, { 'deleted' : ?2 }]}")

获取此日志:

2016-09-27 10:53:26.245 DEBUG 13604 --- [nio-9090-exec-3] o.s.data.mongodb.core.MongoTemplate      : find using query: { "$and" : [ { "$or" : [ { "name" : { "$regex" : "c" , "$options" : "i"}} , { "description" : { "$regex" : "c" , "$options" : "i"}}]} , { "deleted" : false}]} fields: null for class: class com.habber.domain.Entity in collection: entities

请确保您已经导入了log4j。 - Luis Costa
2
我甚至导入了log4j并尝试了相同的解决方案,但对我来说不起作用。 - Vishal A
1
删除 .MongoTemplate。它的作用类似于 logging.level.org.springframework.data.mongodb.core。 - Ryan_D
@VishalA,请查看我的评论,你可能需要调整你的主要日志配置。 - Artem Malchenko

37

另外,您可以使用一个yml配置文件,将其放置在您的application.yml文件中。

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

27

对于ReactiveMongo,请将此属性添加到您的.properties文件中

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

你救了我的命,谢谢伙计。 - undefined

9
这是一个晚回答,但根据问题,正确的答案尚未给出。
其他人已经给出的答案可能对于其他情况有效。但是,如果您正在使用 MongoRepository,则正确的配置应如下所示:
logging.level.org.springframework.data.mongodb.repository.query= debug

您在配置中使用了Query而不是正确的query,这是错误的。

当您添加正确的配置后,记录器将会如下所示:

25-06-2020 17:58:43.301 [http-nio-9001-exec-10] DEBUG o.s.d.m.r.query.MongoQueryCreator.complete(162) - Created query Query: { "customer.id" : 2}, Fields: {}, Sort: {}

1

提议的解决方案是有效的。但是如果您使用@DocumentReference,则可能会注意到日志中不会出现N+1查询。

如果您想知道是否查询了引用的集合,请添加以下属性:

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

0
我认为完整的解决方案是根据 @Wilder Valera 和 @Chaojun Zhong 的建议。
当您想要记录MongoTemplate答案时:
logging:
   level:
       org.springframework.data.mongodb.core.MongoTemplate: DEBUG

当您要记录 ReactiveMongoTemplate 时,应使用:

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

0
记住,即使你这样做
logging:
  level:
    org:
      springframework:
        data:
          mongodb:
            core:
              MongoTemplate: DEBUG

你可能仍然无法看到DEBUG语句,如果你的主记录器配置为仅输出INFO消息。在我们的情况下,我们有一个logback.xml文件,在其中为框架设置了一个级别为INFO的appender。直到我们将其更改为DEBUG,我们才能看到来自MongoDB的查询语句。
<appender name="FRAMEWORKS" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>DEBUG</level>
        </filter>
        ...
</appender>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接