как запросить pymongo с помощью регулярного выражения для значений, содержащих только цифры

#python #regex #mongodb-query #pymongo

Вопрос:

Я работаю с базой данных mongodb, где у меня есть определенное значение, в некоторых документах содержится поле parentDocId, а в других-нет. Помимо того, что ParentDocId имеет множество форм, я хотел бы получить 500 документов, в которых это поле не только существует, но и состоит из 6 или более цифр (никаких других символов). Это тот запрос, который, как я думал, сработает:

 import pymongo
query = {"$and": [{'docReferences.parentDocId':{"$exists":True}},
{'docReferences.parentDocId':{"$regex": "^[0-9][0-9][0-9][0-9][0-9]*$"}}]}
 

Но примененный здесь запрос не работает:

 cur = DATA_collection.find(query).limit(500)
tic=datetime.now()
elements = []
for el in cur: 
    elements.append(el)
tac=datetime.now()
print(f'{tac-tic}')
print(len(elements))
 

это дает мне список ОДНОГО и ТОГО ЖЕ ДОКУМЕНТА 500 раз и не отфильтровывает документы с идентификатором parentDocId, например «1111».

Есть идеи, что я делаю не так?

ПРИМЕЧАНИЕ: при использовании:

 docReferences.parentDocId':{"$isNumber":True}
 

Я получаю:

 unknown operator: $isNumber,
 

Ответ №1:

Шаблон регулярного выражения для шести или более цифр (только) таков ^[0-9]{6,}$ , поэтому вы можете попробовать:

 import pymongo
query = {
    "$and": [
        { 'docReferences.parentDocId' : { "$exists" : True } },
        { 'docReferences.parentDocId' : { "$regex": "^[0-9]{6,}$" } }
    ]
}