2017-09-04 5 views
0

「$」を使用してMongoDBのクエリのperformceの向上:私はMongoDBのサーバー上で次のクエリを実行する必要が表現

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

をあなたがそれらを比較するために、文字列の長さと$cmpを取得するために$strLenCPを提供集約フレームワーク、使用することができます。これはDBに新しいデータを挿入します

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

関連する問題