2015-03-02 44 views
3

我正在用Spring/Mongo/Jersey编写一个API来对POJO执行CRUD,该POJO具有如下属性的通用映射:我该如何使用Spring Data来显示mongo的查询计划(又名cursor.explain())

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/),但我没有看到任何示例演示如何从弹簧数据调用较低级别的驱动程序API。

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

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

可以提供将非常感激任何帮助!

回答

3

我们不提供这种支持,但你可以简单地设置一个断点here org.springframework.data.mongodb.core.MongoTemplate.QueryCursorPreparer.prepare(..)

在调试器你的选择,你可以简单地执行一个

cursor.explain() 

eg通过eclipse显示视图。

+0

感谢您的快速响应! – sottitron 2015-03-03 17:35:45

+0

我们可以对聚合查询做同样的事情吗?因为我无法为聚合查询做这件事,它可以正常查询。 – MasterCode 2016-06-23 20:56:14

0

这里是我落得这样做:

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); 
} 

你可以提供的服务将任何帮助非常感谢!

相关问题