2015-03-02 42 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); 
} 

你可以提供的服務將任何幫助非常感謝!

相關問題