2016-11-23 50 views
0

速度是否有pymongo兩個查詢之間執行的時間差:查詢單場多次執行MongoDB中使用pymongo

db.collection.find({'date': {'$gte': datetime(2000, 01, 01), '$lt': datetime(2016, 11, 23)}}) 

db.collection.find({'date': {'$gte': datetime(2000, 01, 01)}, 'date': {'$lt': datetime(2016, 11, 23)}}) 

在我查詢同場兩次的第二種情況。我檢查了使用蒙戈外殼跑.explain("executionStats"),唯一的區別是在查詢("queryPlanner.parsedQuery"),其中的第一個是:

"$and" : [ 
    { 
     "date" : { 
      "$lt" : ISODate("2016-11-23T00:00:00Z") 
     } 
    }, 
    { 
     "date" : { 
      "$gte" : ISODate("2000-01-01T00:00:00Z") 
     } 
    } 
] 

這對於第二個:

"date" : { 
    "$lt" : ISODate("2016-11-23T00:00:00Z") 
} 

我通過數萬個文檔查詢一個集合,並多次查詢。所以,我需要優化查詢。

+0

是否將「日期」字段編入索引?否則,這應該是提高運營速度的第一步。如果是這樣,兩個解釋計劃之間在指數界限如何應用之間是否存在差異?您可能需要再次運行.explain,並通過'true'選項,例如「.explain(true)」 –

+0

嘿,我在查詢多個字段(大約6)的收集和索引日期不會有太大的幫助。但是'date'字段有一個範圍,所有其他字段只是匹配值相等。所以,我認爲@hyades的回答解釋說我的查詢實際上是錯誤的,並且兩個查詢都不是等價的,因爲我們不能在映射類型(在這種情況下是一個Python字典)中爲兩個不同的值使用相同的鍵。 –

回答

0

如果你在你的第二個查詢仔細一看 -

{'date': {'$gte': datetime(2000, 01, 01)}, 'date': {'$lt': datetime(2016, 11, 23)}} 

,應該遵守,這是一個對象(字典在python),具有鍵datedate,這當然是沒有意義的。您正嘗試使用相同的鍵創建一個對象。因此,只有其中一個是有效的(在這種情況下是第二個)。因此,對mongo的查詢是{date': {'$lt': datetime(2016, 11, 23)}},它不會給你所需的輸出。

我建議您應儘可能清楚地根據邏輯運算符定義查詢。這將是這種情況下explain階段的輸出。因此使用$and來表示兩種不同的條件應該是查詢的最佳方式。

{"$and" : [ 
    {"date" : {"$lt" : ISODate("2016-11-23T00:00:00Z")}}, 
    {"date" : {"$gte" : ISODate("2000-01-01T00:00:00Z")}} 
]} 

來到如何使查詢更快的話題,你應該用在date的索引。將此索引定義爲單獨索引{date: 1}將有助於縮小相關文檔的範圍。