Создание запроса $ elemMatch с несколькими предложениями $ regex в python и mongo - PullRequest
0 голосов
/ 08 октября 2018

Я реализую это руководство Как ускорить запросы регулярных выражений MongoDB с коэффициентом до 10 , и я использую запрос, указанный в конце

db.movies.find({
$and:[{
    $text: {
        $search: "Moss Carrie-Anne"
    }},{
    cast: {
        $elemMatch: {$regex: /Moss/, $regex: /Carrie-Anne/}}
    }]}
);

Проблема, в которой я застрял, состоит в том, как мне сгенерировать подзапрос

$elemMatch: {$regex: /Moss/, $regex: /Carrie-Anne/}

программным способом с python

Мой код пока

def regexGen(s):
  d={}
  for word in s.split(" "):
    d["$regex"]= "/"+word+"/"  # this will of course save only the last value into the dict

  return (d)


query= {
    "$and":[{
        "$text": {
            "$search": "Moss Carrie-Anne"
        }},{
        "cast": {
            "$elemMatch": regexGen("Moss Carrie-Anne")}
        }
    ]
}

print (query)

#actual
# {'$and': [{'$text': {'$search': 'Moss Carrie-Anne'}}, {'cast': {'$elemMatch': {'$regex': '/Carrie-Anne/'}}}]}

#expected
# {'$and': [{'$text': {'$search': 'Moss Carrie-Anne'}}, {'cast': {'$elemMatch': {'$regex': '/Carrie-Anne/'}, {'$regex': '/Moss/'} }}]}

Я, очевидно, отсутствуетчто-то здесь, но не в состоянии разобраться

1 Ответ

0 голосов
/ 08 октября 2018

Вы можете построить динамическое регулярное выражение на основе чередования :

{ "$regex" : "|".join([re.escape(word) for word in s.split()]) }

См. Демонстрационную версию Python :

import re
s = "Moss Carrie-Anne"
print({ "$regex" : "|".join([re.escape(word) for word in s.split()]) })
# => {'$regex': 'Moss|Carrie\-Anne'}

Обратите внимание, чтоMoss|Carrie\-Anne будет соответствовать либо Moss, либо Carrie-Anne.re.escape будет полезно, если у вас есть (, + и другие специальные символы регулярного выражения в вашем буквальном вводе.

...