Python 在Mongo中搜索匹配的ID或属性

Python 在Mongo中搜索匹配的ID或属性,python,mongodb,pymongo,Python,Mongodb,Pymongo,目标: 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)}

目标

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)
)
我希望允许用户按ID搜索文档,或允许其他基于文本的查询

代码

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)
)
错误

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

不是有效的ObjectId

s\u term
在传递给
ObjectId
构造函数时需要是有效的对象ID(或至少格式正确)。因为它有时不是ID,这就解释了为什么会出现异常

请尝试以下方法:

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

s_term
传递给
ObjectId
构造函数时,它必须是有效的对象ID(或至少格式正确)。因为它有时不是ID,这就解释了为什么会出现异常

请尝试以下方法:

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