Использовать как в 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.