#python #mongodb
#python #mongodb
Вопрос:
Всем доброго утра,
Я хотел бы написать фрагмент pymongo для запроса из базы данных всех документов, имеющих определенное значение поля в заданном списке (а также значение, которое является подмножеством любого элемента в данном списке).
В Python у меня было бы два списка, и я хотел бы найти все элементы из списка один, которые содержатся хотя бы в одном элементе из списка два. Например:
list1 = ['abc', 'bob', 'joe_123']
list2 = ['abc', 'joe', 'mike']
for string in list2:
print( string, any([ string in xxx for xxx in list1 ]) )
который дает правильный результат:
abc True
joe True
mike False
Как я мог бы получить то же самое от pymongo? Я попробовал оператор «$ in», но результат неполный.
from pymongo import MongoClient
from pprint import pprint
client = MongoClient('mongodb://localhost:27017')
db = client['test_query']
my_coll = db['test_collection']
list1 = ['abc', 'bob', 'joe_123']
list2 = ['abc', 'joe', 'mike']
for string in list2:
my_coll.insert_one({'string' : string})
cursor = my_coll.find({'string' : { '$in' : list1} })
which misses the case in joe < joe_123
pprint([c for c in cursor])
[{'_id': ObjectId('5f60ce9b682ff1bf4dcafb94'), 'string': 'abc'}]
Кто-нибудь может дать мне подсказку по этому поводу?
В более общем плане, каков синтаксис для включения списка понимания python в запрос pymongo?
Большое вам спасибо
Марко
Ответ №1:
$in
в mongodb не соответствует частичной строке.
Для этого вы должны использовать $regex
, например
for string in list1:
my_coll.insert_one({'string' : string})
query = {'$regex': '|'.join(list2)}
cursor = my_coll.find({'string' : query})
pprint([c for c in cursor])