2017-09-04 51 views
0

我需要一個MongoDB的服務器上運行以下查詢的MongoDB查詢performce:

QUERY = { 
    "$and" : [ 
     {"x" : {'$gt' : 1.0}}, 
     {"y" : {'$gt' : 0.1}}, 
     {"$where" : 'this.s1.length < this.s2.length+3'} 
    ] 
} 

這個查詢是很慢的,由於JavaScript表達式其中服務器需要在集合中的每個文檔上執行。

有沒有什麼辦法讓我優化它?

我曾考慮過使用$size運算符,但我不確定它是否適用於字符串,而且我更不確定如何比較它在一對字符串上的輸出(如此處所示) 。

這是需要我的腳本的其餘部分,在案例:

from pymongo import MongoClient 

USERNAME  = ... 
PASSWORD  = ... 
SERVER_NAME  = ... 
DATABASE_NAME = ... 
COLLECTION_NAME = ... 

uri = 'mongodb://{}:{}@{}/{}'.format(USERNAME,PASSWORD,SERVER_NAME,DATABASE_NAME) 
mongoClient = MongoClient(uri) 
collection = mongoClient[DATABASE_NAME][COLLECTION_NAME] 
cursor = collection.find(QUERY) 
print cursor.count() 

pymongo版本是3.4。

謝謝:)

回答

1

您可以使用聚合框架,它提供$strLenCP得到一個字符串的長度和$cmp比較他們:

db.collection.aggregate(
    [ 
    { 
     $match: { 
     "x" : {'$gt' : 1.0}, 
     "y" : {'$gt' : 0.1} 
     } 
    }, 
    { 
     $addFields: { 
     str_cmp: { $cmp: [ { $strLenCP: "$s1" }, { $add: [ { $strLenCP: "$s2" }, 3 ] } ] } 
     } 
    }, 
    { 
     $match: { 
     "str_cmp": -1, 
     } 
    } 
    ] 
) 
+0

將這個新數據插入到數據庫? – goodvibration

+0

爲什麼?你需要取或插入? –

+0

順便說一句,正如你可以在我的查詢中看到的,我正在試圖聚合那些's1'的長度小於s2' + 3的長度的情況。我怎樣才能調整你的解決方案來做到這一點? – goodvibration