org.bson.json.JsonParseException:JSON 阅读器期待一个值,但发现 ':' - Springboot 中的 Mongo 查询抛出此错误

Posted

技术标签:

【中文标题】org.bson.json.JsonParseException:JSON 阅读器期待一个值,但发现 \':\' - Springboot 中的 Mongo 查询抛出此错误【英文标题】:org.bson.json.JsonParseException: JSON reader was expecting a value but found ':' - Mongo query in springboot throwing this errororg.bson.json.JsonParseException:JSON 阅读器期待一个值,但发现 ':' - Springboot 中的 Mongo 查询抛出此错误 【发布时间】:2021-06-20 19:43:54 【问题描述】:

我正在尝试获取在给定字段中具有匹配字符串的所有记录。

    @Query('''$match:
                 $or :
                        [
                            'name' :  $regex: ?0, $options:'i' ,
                            'displayName' :  $regex: ?0, $options:'i' ,
                            'url' :  $regex: ?0, $options:'i'  
                        ]
                
               ''')
    Page<Project> findAllByNameOrSeoNameOrDomainNameOrUrl(String searchString, Pageable pageable)

我正在给出这个查询,但它抛出了错误。 知道我做错了什么吗?以及如何解决?

DEBUG o.s.w.s.m.m.a.ExceptionHandlerExceptionResolver.doResolveHandlerMethodException - Using @ExceptionHandler com.dashboard.exception.handler.CustomExceptionHandler#handleAbstractException(Exception)
org.bson.json.JsonParseException: JSON reader was expecting a value but found ':'.
        at org.springframework.data.mongodb.util.json.ParameterBindingJsonReader.readBsonType(ParameterBindingJsonReader.java:327)
        at org.springframework.data.mongodb.util.json.ParameterBindingDocumentCodec.readList(ParameterBindingDocumentCodec.java:318)
        at org.springframework.data.mongodb.util.json.ParameterBindingDocumentCodec.readValue(ParameterBindingDocumentCodec.java:297)
        at org.springframework.data.mongodb.util.json.ParameterBindingDocumentCodec.decode(ParameterBindingDocumentCodec.java:195)
        at org.springframework.data.mongodb.util.json.ParameterBindingDocumentCodec.decode(ParameterBindingDocumentCodec.java:61)
        at org.springframework.data.mongodb.util.json.ParameterBindingDocumentCodec.readValue(ParameterBindingDocumentCodec.java:311)
        at org.springframework.data.mongodb.util.json.ParameterBindingDocumentCodec.decode(ParameterBindingDocumentCodec.java:195)
        at org.springframework.data.mongodb.util.json.ParameterBindingDocumentCodec.decode(ParameterBindingDocumentCodec.java:175)
        at org.springframework.data.mongodb.repository.query.StringBasedMongoQuery.createQuery(StringBasedMongoQuery.java:121)
        at org.springframework.data.mongodb.repository.query.AbstractMongoQuery.doExecute(AbstractMongoQuery.java:116)
        at org.springframework.data.mongodb.repository.query.AbstractMongoQuery.execute(AbstractMongoQuery.java:101)
        at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:618)
        at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:605)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
        at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:80)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
        at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:95)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
        at com.sun.proxy.$Proxy117.findAllByNameOrSeoNameOrDomainNameOrUrl(Unknown Source)
        at com.dashboard.repository.ProjectRepository$findAllByNameOrSeoNameOrDomainNameOrUrl$1.call(Unknown Source)
        at com.dashboard.services.impl.ProjectServiceImpl.fetchAllProjectBySearchString(ProjectServiceImpl.groovy:262)
        at com.dashboard.services.ProjectService$fetchAllProjectBySearchString$0.call(Unknown Source)
        at com.dashboard.controller.api.ProjectController.fetchAll(ProjectController.groovy:89)
        at sun.reflect.GeneratedMethodAccessor109.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

【问题讨论】:

您在@Query 中使用$match: 的原因是什么?此外,请尝试使用双引号 ("...") 将查询值括起来。 @prasad_ 我在 mongoshell db.projects.aggregate("$match": "$or":["name": "$regex":"test" , "displayName": "$regex":"book" ]).pretty() 其工作正常。 然后使用@Aggregation @Query. 【参考方案1】:

我弄错了。我正在做的。 $or 中缺少大括号 。也不需要像@prasad_ 在评论中所说的那样匹配。

@Query(''' $or :
                        [
                            'name' :  $regex: ?0, $options:'i' ,
                            'displayName' :  $regex: ?0, $options:'i' ,
                            'url' :  $regex: ?0, $options:'i'  
                        ]
                
               ''')

【讨论】:

以上是关于org.bson.json.JsonParseException:JSON 阅读器期待一个值,但发现 ':' - Springboot 中的 Mongo 查询抛出此错误的主要内容,如果未能解决你的问题,请参考以下文章