我如何哄Spring Data向我展示mongo的查询计划(a.k.a cursor.explain())

时间:2015-03-02 19:37:23

标签: spring mongodb jersey spring-data

我正在用Spring / Mongo / Jersey编写一个API,在一个POJO上做CRUD,它有一个像这样的属性的通用映射:

public class Thing {
    private String id;

    @Indexed
    private Map<String,String> properties;
...

返回商品非常有用。我的资源代码如下所示:

BasicDBObject query = new BasicDBObject("properties.name", "vlad the impaler");
return Response.ok(myService.queryThings(query)).build();

我的抽象DAO看起来像这样:

public List<T> find(Query query) {
        return mongoOps.find(query, clazzOfItem);
}

我能说的是 @Indexed 注释是否有效。我想尝试解释,( http://docs.mongodb.org/manual/reference/method/cursor.explain/),但我没有看到任何示例告诉我如何调用较低级别的驱动程序来自spring数据的API。

我希望能够像这样开启调试:

public List<T> find(Query query) {
        if (debugOn) {
            String queryPathDetails = mongoOps.executeCommand( /*NOW WHAT??*/ ).toString();
            logger.log(queryPathDetails);
        }
        return mongoOps.find(query, clazzOfItem);
}

非常感谢您提供的任何帮助!

2 个答案:

答案 0 :(得分:4)

我们尚未提供支持,但您只需设置断点here     org.springframework.data.mongodb.core.MongoTemplate.QueryCursorPreparer.prepare(..)

在您选择的调试器中,您只需执行

即可
cursor.explain()

e.g。通过日食显示视图。

答案 1 :(得分:1)

这是我最终做的事情:

public Object explainQuery(Query query) {
        //Not sure this is safe, please comment if there is a better way!
        String collectionName =  clazzOfItem.getSimpleName().toLowerCase();
        DBCollection collection = mongoOps.getCollection(collectionName);
        DBCursor cursor = collection.find(query.getQueryObject());
        return cursor.explain();
}

所以回到我上面列出的DAO代码,我现在可以这样做:

public List<T> find(Query query) {
    if (debugOn) {
        Object queryPlan = explainQuery(query);
        logger.log(queryPlan);
    }
    return mongoOps.find(query, clazzOfItem);
}

非常感谢您提供的任何帮助!