• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    미해결

pymongo.errors.OperationFailure: $regex has to be a string

20.04.13 18:34 작성 조회수 361

2

게시판 글 리스트 하던중 검색에서 부터 에러가 발생하였습니다.

두곳 find 값을 {}로 하고 save하고 창을 띄우면 우선 창은 뜸니다 

그런데 자동적으로 검색창 안에 None이라고 떠있습니다.

파이썬 이라고 검색하면 우선 검색은 되는데 터미널에 '$regex': None

검색어인 파이썬 이라고 떠야 하는 것을 알고 있습니다.

그리고 주소창에 keyword=파이썬이라고 우선 뜨지만 페이지를 변경하거나 상새페이지로 이동하면

keyword=파이썬이란 글이  유지되지 않고 사라집니다

동영상 강의대로 keyword=keyword, search=search page=page 각각 다 추가하였는데 이런 현상이 발생됩니다. 

lists에 있는 find 두속에 {}를 지우고 query집어넣으면 에러 창이 뜹니다.

pymongo에 문재란거 같은대 내용으로썬 잘 이해가 안가는 내용입니다.

run.py 에 view method 맨 아래 search=search에 에러표기도 되었습니다.

60분짜리 강의여서 coding도 많았고 좀 많은 문제가 발생한거 같습니다.

확실히 기역하는것은 검색부터  문제가 시작되었고 find(query)라고 에러창도 뜨기 시작한것입다.

아래에 run.py에 lists부분과  list.html에 search function쪽 제가 코딩을 업로드 해놨습니다.

답변 2

·

답변을 작성해보세요.

1

pymongo.errors.OperationFailure: $regex has to be a string

는 regex 는 문자열이어야 한다 뭐 그런 뜻으로 보시면 될 것 같습니다. 위의 상황에서 검색어를 입력하지 않은 경우 

keyword = request.args.get("keyword", type=str)

이렇게만 하면 keyword 값이 존재 하지 않는 경우 keyword 변수에는 None 값이 들어가게 됩니다. 그로인해 find() 함수 호출시 검색 조건에 None 이 기입되어있을테고 그래서 파이몽고가 None 을 입력받았기 때문에 오류가 발생하고 None 이 아닌 문자열 값을 넘겨달라는 오류 입니다.

keyword = request.args.get("keyword", "", type=str)

위와 같은 식으로 기본값을 "" 빈 문자열로 설정하면 해당 문제는 해결되리라 보여집니다.

그리고 view 에 워닝으로 표기되는 search 값은 해당 밑줄에서 마우스 오버를 해보시면 오류의 원인이 나옵니다 그 부분을 참고하셔야 할듯 합니다. 단순 pylint 의 경고성 표기인지 오류인지 위의 스샷만 봐서는 알 수가 없을듯 합니다.

"파이썬" 검색시에 페이지를 변경하거나 상세페이지를 들어가면 값이 사라진다고 하셨는데 페이지 변경이 어떤걸 말씀하시는지 몰라 그 부분은 정확한 답을 드리기가 어렵겠고 상세페이지를 들어가면 값이 사라지는건 상세페이지로 링크를 하게 되는 경우 

<!--반복되는 구간-->
{% for data in datas %}
<tr>
    <td>{{(tot_count + 1) - (loop.index + ((page - 1) * limit))}}</td>
    <td><a href="{{url_for('board.board_view', idx=data._id, page=page, search=search, keyword=keyword)}}">{{data.title}}</a></td>
    <td>{{data.name}}</td>
    <td>{{data.pubdate | formatdatetime}}</td>
    <td>{{data.view}}</td>
</tr>
{% endfor %}
<!--반복되는 구간 끝-->

그러니까 위의 리스트가 출력되는 html 에서 board_view 링크에 search 와 keyword 값이 제대로 설정되어있는지부터 확인해보셔야 할듯 합니다. 브라우저에서 해당 검색 결과 리스트를 출력해놓은 상태에서 마우스 우클릭 > 소스보기를 하시면

위의 이미지에서처럼 search 와 keyword 값이 소스보기상에 나타나야 합니다. 여기서 문제가 없다면 py 파일의 view 함수에서 해당 search, keyword 변수값이 제대로 request 되는지 확인해보셔야 합니다.

def board_view(idx):
    #idx = request.args.get("idx")
    if idx is not None:
        page = request.args.get("page")
        search = request.args.get("search")
        keyword = request.args.get("keyword")

        print("페이지:{} 대상:{} 검색어:{}".format(page, search, keyword))
        board = mongo.db.board
        # data = board.find_one({"_id": ObjectId(idx)})
        data = board.find_one_and_update({"_id": ObjectId(idx)}, {"$inc": {"view": 1}}, return_document=True)

위의 코드에서처럼 print 문을 활용하여 값이 제대로 넘어왔는지 확인해보시길 바랍니다.

0

nicolas83님의 프로필

nicolas83

질문자

2020.04.14

잘 해결되었습니다

고맙습니다.