java - spring-data-mongodb 可选查询参数

标签 java spring mongodb annotations spring-data-mongodb

我正在使用 spring-data-mongodb。

我想通过在查询中传递一些可选参数来查询数据库。

我有一个域类。

public class Doc {  
    @Id
    private String id;

    private String type;

    private String name;

    private int index;  

    private String data;

    private String description;

    private String key;

    private String username;
    // getter & setter
}

我的 Controller :

@RequestMapping(value = "/getByCategory", method = RequestMethod.GET, consumes = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON)
    public Iterable<Doc> getByCategory(
            @RequestParam(value = "key", required = false) String key,
            @RequestParam(value = "username", required = false) String username,
            @RequestParam(value = "page", required = false, defaultValue = "0") int page,
            @RequestParam(value = "size", required = false, defaultValue = "0") int size,
            @RequestParam(value = "categories") List<String> categories)
            throws EntityNotFoundException {
        Iterable<Doc> nodes = docService.getByCategory(key, username , categories, page, size);
        return nodes;
    }

这里的Keyusername是可选的查询参数。

如果我传递其中任何一个,它应该返回具有给定 key 或用户名的匹配文档。

我的服务方式是:

public Iterable<Doc> getByCategory(String key, String username, List<String> categories, int page, int size) {

        return repository.findByCategories(key, username, categories, new PageRequest(page, size));
    }

存储库:

@Query("{ $or : [ {'key':?0},{'username':?1},{categories:{$in: ?2}}] }")    
List<Doc> findByCategories(String key, String username,List<String> categories, Pageable pageable);

但是通过使用上面的查询,它不会返回具有给定键或用户名的文档。 我的查询有什么问题?

这就是我提出请求的方式 <强> http://localhost:8080/document/getByCategory?key=key_one&username=ppotdar&categories=category1&categories=category2

最佳答案

就个人而言,那时我会放弃接口(interface)驱动的存储库模式,创建一个 @Autowire 是 MongoTemplate 对象的 DAO,然后使用 Criteria 相反。这样,您就有了清晰的代码,不会扩展 @Query 注释的功能。

所以,像这样(未经测试的伪代码):

@Repository
public class DocDAOImpl implements DocDAO {
    @Autowired private MongoTemplate mongoTemplate;

    public Page<Doc> findByCategories(UserRequest request, Pageable pageable){
        //Go through user request and make a criteria here
        Criteria c = Criteria.where("foo").is(bar).and("x").is(y); 
        Query q = new Query(c);
        Long count = mongoTemplate.count(q);

        // Following can be refactored into another method, given the Query and the Pageable.
        q.with(sort); //Build the sort from the pageable.
        q.limit(limit); //Build this from the pageable too
        List<Doc> results = mongoTemplate.find(q, Doc.class);
        return makePage(results, pageable, count);
    }

    ...
}

我知道这与运行时生成数据库代码的趋势背道而驰,但在我看来,它仍然是更具挑战性的数据库操作的最佳方法,因为它更容易看到实际发生的情况。

关于java - spring-data-mongodb 可选查询参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30841152/

相关文章:

java - Spring Boot 连接到 AWS RDS MySQL - SSLHandshakeException : Received fatal alert: unknown_ca

java - 如何设置 Spring/HIbernate JPA @Entiry 创建自动递增列(无 id)

mongodb 'count' 查询很慢

mongodb - 是提示({$自然: 1}) redundant when using a tailable cursor?

java - Android - 单例类仅在第二次刷新时更新

java - 在 Apache 服务器 2.2 上运行两个虚拟主机。* 总是转到第一个服务器名称的文档根目录

java - 变量必须是 'temporary' 才被视为 'throwaway' 吗?

spring - Elasticsearch API与Spring数据与Logstash

java - 使用 Springs OSGI 动态模块时是否需要 blueprint.xml?

javascript - 无法在简单的node.js应用程序中找到模块mongodb