改进使用“$ where”表达式的MongoDB查询的执行

时间:2017-09-04 16:18:05

标签: python mongodb python-2.7 mongodb-query

我需要在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 个答案:

答案 0 :(得分: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,
      }
    }
  ]
)