Java 使用ObjectID的Spring Data Mongo自定义存储库查询

Java 使用ObjectID的Spring Data Mongo自定义存储库查询,java,spring,mongodb,spring-mvc,spring-data-mongodb,Java,Spring,Mongodb,Spring Mvc,Spring Data Mongodb,我有一个mongo查询,我想作为Spring mongo存储库实现 db.collection.find({ 'items': { $elemMatch: { 'refund.$id' : ObjectId('5638cab2e4b07ff212618d7e') } } }) 我的存储库界面是 @Query("{ 'items': { $elemMatch: { 'refund.$id' : ObjectId(?0) } } }")

我有一个mongo查询,我想作为Spring mongo存储库实现

db.collection.find({ 'items': 
    { $elemMatch: { 
        'refund.$id' :  ObjectId('5638cab2e4b07ff212618d7e') 
        } 
    }
}) 
我的存储库界面是

@Query("{ 'items': { $elemMatch: { 'refund.$id' :  ObjectId(?0) } } }")
RMA findRMAByItemRefund(String refundId);
它抛出JSONParseException

Caused by: com.mongodb.util.JSONParseException: 
{ 'items': { $elemMatch: { 'refund.$id' :  ObjectId("_param_0") } } }
                                       ^
    at com.mongodb.util.JSONParser.parse(JSON.java:216)
试试这个

@Query("{ 'items': { $elemMatch: { 'refund.id' :  ?0 } } }")
RMA findRMAByItemRefund(String refundId);
根据我的经验,
?0
应该是独立的,而不是用作mongo函数参数


另外,
$id
是您自己的假设,还是该字段实际存储为
$id
。如果没有,我将使用
return.id

,因为接受的解决方案在我的情况下没有产生任何结果,我必须找到另一个解决方案,即:

我没有使用通过
@query(…)
定义的自动生成查询功能,而是选择手动构建用于查询mongo的
DBObject
,并将该功能定义为界面中的
默认实现,从而保持其“干净”
(
-因为必须引入一个
\u查询
方法)

注意:此解决方案仅适用于Java1.8+

public interface SomeRepository extends MongoRepository<SomeEntity, String> {

    @Query("{'nestedEntity._id': ?0}")
    SomeEntity findByNestedEntityId_DoesntWork(String nestedEntityId);

    @Query("?0")
    SomeEntity _query(DBObject query);

    default SomeEntity findByNestedEntityId(String nestedEntityId) {
        DBObject queryObject = BasicDBObjectBuilder
            .start("nestedEntity._id", new ObjectId(nestedEntityId))
            .get();

        return this._query(queryObject);
    }
}
公共接口SomeRepository扩展了MongoRepository{ @查询(“{'nestedEntity.\u id':?0}”) SomeEntity FindBynedEntityId_不工作(字符串nestedEntityId); @查询(“?0”) SomeEntity\u查询(DBObject查询); 默认SomeEntity FindBynedEntityId(字符串nestedEntityId){ DBObject queryObject=BasicDBObjectBuilder .start(“nestedEntity.\u id”,新对象id(nestedEntityId)) .get(); 返回此。_查询(queryObject); } }
我想我的问题有点不同,但因为我在任何地方都找不到答案,所以我认为值得一提。 基本上,我想通过ObjectId和userId进行搜索,所以我做了以下工作:

@Query(“{u-id':?0,'userId':?1}”)
T findbyobjectanduserid(最终ObjectId ObjectId,最终Long userId);

这是
mongo
文档中的示例对象:

{ 
    "_id" : ObjectId("5c052a43f14008522c1c90c8"), 
    "_class" : "com.gdn.payment.report.entity.ReportDocument", 
    "status" : "DONE", 
    "report" : {
        "id" : ObjectId("5c0508bcf14008460015eb07"), 
        "startDate" : NumberLong(1542795843188), 
        "endDate" : NumberLong(1543568857157), 
        "fields" : [
            "customerInfo.billingAddress.streetAddress", 
            "customerInfo.name", 
            "items[*].name", 
            "orderId", 
            "type"
        ]
    }
}
您可以仅使用
ObjectId
数据类型创建用于搜索
report.id
的存储库方法,我尝试仅使用字符串,但无法使用,以下是我的存储库方法:

Page<ReportDocument> findByReport_id(ObjectId reportId, Pageable pageable)

我建议使用Spring数据。您也可以在顶部使用


然后,您就可以编写更复杂的查询,而不必处理诸如查询语法和解析之类的次要问题。

您是否试图将参数
returnID
绑定到查询参数
return.$id
?如果
return
是另一个实体,那么您可以尝试
return.id
,因为Spring没有这个id自行转换是的。它很有效@JoaoEvangelista Spring处理转换。非常感谢您如果接受的解决方案中的$elemMatch不适合您,请尝试此解决方案。它工作得非常好!
new ObjectId({input-reportId-string})