【问题标题】:spring data for mongodb with map based find带有基于地图的查找的 mongodb 弹簧数据
【发布时间】:2014-04-02 11:52:31
【问题描述】:

Spring data 为 mongodb 的 CRUD、分页和排序提供了各种存储库。 当我们需要使用各种属性的 mongodb 文档时,我们倾向于编写 findBy 方法或编写带有 @Query 注释的显式查询的方法。 但是,如果我的文档有很多属性并且我需要各种获取文档的方法,那么 Spring 是否提供了一个“存储库方法”,它接收属性和值的 Map? 写各种findBy可能比较麻烦。使用QueryDSL 似乎是一种选择,但需要代码生成和 build.gradle 更改。如果基于地图的解决方案不可用,我可以使用 QueryDSL。

例如:

class FooDocument {
    String id ;//mongodb ObjectId
    String name
    String version
    boolean deleteIndicator
    ... any more attributes
}

需要在存储库中使用类似的方法

 List<FooDocument> findByMap ( Map attrValMap );

调用方法(groovy)

repository.findByMap ( [ "name" : "fooname", "version" : "1.0" ] )
repository.findByMap ( [ "name" : "fooname"] )
repository.findByMap ( [ "version" : "1.0", "deleteIndicator" : false] )

我愿意使用 Criteria/Query 组合或使用 MongoOperations 接口基于 BasicDBObject 的提取来编写此方法,以防 Spring Data 不提供开箱即用的功能。

【问题讨论】:

    标签: spring-data spring-data-mongodb


    【解决方案1】:

    我不确定 Spring Data 是否可以轻松做到这一点。但是如果你愿意使用MongoDB的BasicDBObject来获取你需要的东西,那么你可以通过以下方式使用它:

    BasicDBObject doc = new BasicDBObject("name", "fooname").append("version", "1.0");
    DBCursor cursor = find(doc);
    List<FooDocument> fooDocList = new ArrayList<FooDocument>();
    while (cursor.hasNext()) { 
        DBObject obj = cursor.next(); 
        FooDocument foo = mongoTemplate.getConverter().read(FooDocument.class, obj);  
        fooDocList.add(foo); 
    }
    

    【讨论】:

    • 查询选项似乎更容易。我可以在存储库上声明 findByQuery(Query query) 方法并提供此方法的自定义实现,它将调用委托给接受 Query 实例的 MongoOperations#methods。我不需要搞乱迭代和获取。但希望 Spring 存储库为 mongodb 提供开箱即用的此类功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-03
    • 1970-01-01
    • 1970-01-01
    • 2017-11-07
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多