繁体   English   中英

mongodb 查找输入的模式

[英]mongodb find a pattern of an input

我需要找到以特定输入开头的所有结果,例如输入:“Paul”、“pau”、“paul Gr”、“Paul Green”、“Paul Gree”、“Pel”、“pele”、“ joh","john" 等。搜索必须不区分大小写..它假设返回所有这些(输入搜索字符串至少有 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}])

但它不适用于“保罗格林”

searched_player_name_string 是给定的输入(上面的输入,例如 Paul Green)

您需要为查询条件提供正确的正则表达式

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

正则表达式游乐场

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)

蒙戈游乐场

将您的输入拆分为单独的字符串,对每个字符串运行查询并将结果附加在一起(首先检查尚未找到),最后对结果进行排序:

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))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM