Использовать как в MongoDB

Я пытаюсь написать запрос в mongo, который ранее был написан в MySQL Я пытаюсь реализовать поиск по нескольким полям с помощью запроса

collection = get_connection(settings.DATABASE_NAME, settings.FARM_COLLECTION)
    result = list(collection.find(
        {'$or': [{'farm_name': "Test_Farm_26"}]}
    ).limit(filter['limit']).skip(filter['skip']))
    print(result)

тогда я получаю следующий вывод

[{'_id': ObjectId('6331920021a8c44f7e95ea4e'), 'farm_id': 1, 'farm_acreage': 50, 'farm_name': 'Test_Farm_26', 'assignee_id': 1, 'is_active': True, 'farm_location': {'lgd_state_id': 9, 'district_code': 119, 'sub_district_code': 755, 'village_code': 122028, 'lat': 27.934293908219843, 'lng': 78.0054819610702}, 'area_latest_id': 1, 'zone_latest_id': 0, 'created_at': datetime.datetime(2022, 9, 26, 11, 50, 24, 138000), 'updated_at': datetime.datetime(2022, 9, 26, 11, 59, 50, 289000), 'created_by_id': 0, 'updated_by_id': 0, 'farm_area': [{'area_id': 1, 'area_acerage': 3, 'area_structure_type': 'polyhouse'}], 'farm_area_count': 1}]

Как вы видите, фильтр поиска по столбцу "имя_фермы" работает, когда я передаю его полное значение но когда я передаю его половинное значение и пытаюсь использовать оператор LIKE в MongoDB

Я получаю пустой список в качестве выходного сигнала

    collection = get_connection(settings.DATABASE_NAME, settings.FARM_COLLECTION)
    result = list(collection.find(
        {'$or': [{'farm_name': "/26/"}]}
    ).limit(filter['limit']).skip(filter['skip']))
    print(result)

Судя по комментариям и правке, похоже, что вы уже довольно близко подошли к этому моменту после перехода от точного совпадения строк к регексному подходу.

Ваша оставшаяся проблема заключается в том, что строка test_farm_26 не соответствует regex /^26/i. Это не имеет никакого отношения непосредственно к MongoDB. Скорее, это напрямую связано с определением regex. Вы добавили символ ^ в regex, и этот символ соответствует началу строки. Таким образом, ваш регекс будет только соответствовать строке, которая начинается с 26. Строка test_farm_26 не начинается с этого, поэтому она не совпадает. Вы можете увидеть это в примере на regex101.

Для решения этой проблемы необходимо просто изменить ваш regex. Возможно, самое простое - просто убрать символ ^ и сделать вместо него регекс /26/ (как показано в этом примере). Если вместо этого вы хотите, чтобы строки заканчивались символом 26, то регекс должен быть /26$. Таким образом, ваш желаемый запрос может выглядеть примерно так:

db.collection.find({
  farm_name: {
    "$regex": "26$",
    "$options": "i"
  }
})

Вы можете увидеть демонстрацию этого запроса в этом примере mongoplayground.

Вернуться на верх