怎么哄Spring数据给我看mongo的查询计划(a.k.a cursor.explain())
How can I coax Spring Data to show me mongo's query plan (a.k.a cursor.explain())
我正在用 Spring/Mongo/Jersey 写一个 API 来在具有如下通用属性映射的 POJO 上执行 CRUD:
public class Thing {
private String id;
@Indexed
private Map<String,String> properties;
...
这对 return 项非常有效。我的资源代码如下所示:
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 注释是否有效。我想尝试 explain,(http://docs.mongodb.org/manual/reference/method/cursor.explain/),但我没有看到任何示例说明如何从 API 调用较低级别的驱动程序spring数据。
我希望能够像这样打开调试:
public List<T> find(Query query) {
if (debugOn) {
String queryPathDetails = mongoOps.executeCommand( /*NOW WHAT??*/ ).toString();
logger.log(queryPathDetails);
}
return mongoOps.find(query, clazzOfItem);
}
非常感谢您提供的任何帮助!
我们还没有为此提供支持,但您可以简单地设置一个断点 here
org.springframework.data.mongodb.core.MongoTemplate.QueryCursorPreparer.prepare(..)
在您选择的调试器中,您可以简单地执行一个
cursor.explain()
例如通过 eclipse 显示视图。
这是我最后做的:
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);
}
非常感谢您提供的任何帮助!
我正在用 Spring/Mongo/Jersey 写一个 API 来在具有如下通用属性映射的 POJO 上执行 CRUD:
public class Thing {
private String id;
@Indexed
private Map<String,String> properties;
...
这对 return 项非常有效。我的资源代码如下所示:
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 注释是否有效。我想尝试 explain,(http://docs.mongodb.org/manual/reference/method/cursor.explain/),但我没有看到任何示例说明如何从 API 调用较低级别的驱动程序spring数据。
我希望能够像这样打开调试:
public List<T> find(Query query) {
if (debugOn) {
String queryPathDetails = mongoOps.executeCommand( /*NOW WHAT??*/ ).toString();
logger.log(queryPathDetails);
}
return mongoOps.find(query, clazzOfItem);
}
非常感谢您提供的任何帮助!
我们还没有为此提供支持,但您可以简单地设置一个断点 here org.springframework.data.mongodb.core.MongoTemplate.QueryCursorPreparer.prepare(..)
在您选择的调试器中,您可以简单地执行一个
cursor.explain()
例如通过 eclipse 显示视图。
这是我最后做的:
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);
}
非常感谢您提供的任何帮助!