Поиск идентификатора или имущества для совпадения в Монго - PullRequest
0 голосов
/ 29 июля 2011

Цель

Я хочу разрешить пользователю выполнять поиск документа по идентификатору или разрешать другие текстовые запросы.

Код

l_search_results = list(
    cll_sips.find(
        {
            '$or': [
                {'_id': ObjectId(s_term)},
                {'s_text': re.compile(s_term, re.IGNORECASE)},
                {'choices': re.compile(s_term, re.IGNORECASE)}
            ]
        }
    ).limit(20)
)

Error

<Whatever you searched for> is not a valid ObjectId

1 Ответ

3 голосов
/ 30 июля 2011

s_term должен быть действительным идентификатором объекта (или, по крайней мере, в правильном формате) при передаче его конструктору ObjectId. Поскольку иногда это не удостоверение личности, это объясняет, почему вы получаете исключение.

Попробуйте что-то вроде этого:

from pymongo.errors import InvalidId

or_filter = [
    {'s_text': re.compile(s_term, re.IGNORECASE)},
    {'choices': re.compile(s_term, re.IGNORECASE)}
]

try:
    id = ObjectId(s_term)
    or_filter.append({ '_id': id })
except InvalidId:
    pass

l_search_results = list(
    cll_sips.find({ '$or': or_filter }).limit(20)
)
...