mongodb найти шаблон входа - PullRequest
       4

mongodb найти шаблон входа

0 голосов
/ 21 марта 2020

Мне нужно найти все результаты, которые начинаются с определенного ввода, например, для входных данных: "Paul", "pau", "paul Gr", "Paul Green", "Paul Gree", "Pel", "pele" "," joh "," john "et c .. Поиск должен выполняться без учета регистра .. он предполагает возвращение всех из них (длина входной строки поиска не менее 3 символов):

[
  {
    "_id": ObjectId("5e6ffe413f71835ae3aa4b60"),
    "f": "Paul",
    "id": 11811,
    "l": "Pelè",
    "r": 64
  },
  {
    "_id": ObjectId("5e6ffe413f71835ae3aa4b65"),
    "f": "paul",
    "id": 11811,
    "l": "walker",
    "r": 64
  },
  {
    "_id": ObjectId("5e6ffe413f71835ae3aa4b66"),
    "f": "johnny",
    "id": 11811,
    "l": "Green",
    "r": 64
  }
]

попытался сделать следующее:

 contain_searched_term_players = list(db.players_collection.find({'$or': [{'f': {'$regex': searched_player_name_string, '$options': 'i'}},
                                                                         {'l': {'$regex': searched_player_name_string, '$options': 'i'}},
                                                                         {'c': {'$regex': searched_player_name_string, '$options': 'i'}}]}).sort([{'r', -1}])

, но это не работает для "Пола Грина"

искомая_по_имя_строки - это заданный вход (входные данные, например, Пол Грин) )

Ответы [ 2 ]

1 голос
/ 21 марта 2020

Необходимо указать правильное регулярное выражение для условия запроса

^(Paul Green|Paul Gree|Paul|paul|pau|Gr|pele|Pel|john|joh)

RegexPlayground

searched_player_name_string = "^(Paul Green|Paul Gree|Paul|paul|pau|Gr|pele|Pel|john|joh)"
result_cursor = db.players_collection.find({
  "$or": [
    {
      "f": {
        "$regex": searched_player_name_string,
        "$options": "i"
      }
    },
    {
      "l": {
        "$regex": searched_player_name_string,
        "$options": "i"
      }
    },
    {
      "c": {
        "$regex": searched_player_name_string,
        "$options": "i"
      }
    }
  ]
})
searched_player_name_string = list(result_cursor)

MongoPlayground

0 голосов
/ 21 марта 2020

Разделите ваши входные данные на отдельные строки, запустите запрос для каждой и добавьте результаты вместе (проверяя сначала, что он еще не найден), Наконец, сортируйте результаты:

searched_player_name_string = 'Paul Green'
found_players = []

for regex in searched_player_name_string.split():
    contain_searched_term_players = db.players_collection.find({'$or': [{'f': {'$regex': regex, '$options': 'i'}},
                                                                             {'l': {'$regex': regex, '$options': 'i'}},
                                                                             {'c': {'$regex': regex, '$options': 'i'}}]})
    for player in contain_searched_term_players:
        # The next line avoids creating duplicate answers if there are multiple matches for the same player
        if player['_id'] not in [ o['_id'] for o in found_players ]:
            found_players.append(player)

# Sort the output by "r" - highest first
pprint.pprint(sorted(found_players, key=lambda o: o['r'], reverse=True))
...