список понимания в запросе pymongo

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