Pymongo insert 를 해결 할 때 자동 으로 추 가 됩 니 다질문

7613 단어 Pymongoinsertid
pymongo 를 사용 할 때 작은 구 덩이 를 만 났 습 니 다:
Flask 프레임 워 크 에서 사전 을 mongodb 에 삽입 한 후 되 돌아 오 면 오류 가 발생 합 니 다.

@app.route('xxxx')
def main():
 ...
 data = {
 'a':'a',
 'b':'b'
 }
 mycol.insert_one(data)
 return data

Traceback (most recent call last):
 File "/home/xiang/.local/lib/python3.6/site-packages/flask/app.py", line 2464, in __call__
 return self.wsgi_app(environ, start_response)
 File "/home/xiang/.local/lib/python3.6/site-packages/flask/app.py", line 2450, in wsgi_app
 response = self.handle_exception(e)
 File "/home/xiang/.local/lib/python3.6/site-packages/flask/app.py", line 1867, in handle_exception
 reraise(exc_type, exc_value, tb)
 File "/home/xiang/.local/lib/python3.6/site-packages/flask/_compat.py", line 39, in reraise
 raise value
 File "/home/xiang/.local/lib/python3.6/site-packages/flask/app.py", line 2447, in wsgi_app
 response = self.full_dispatch_request()
 File "/home/xiang/.local/lib/python3.6/site-packages/flask/app.py", line 1953, in full_dispatch_request
 return self.finalize_request(rv)
 File "/home/xiang/.local/lib/python3.6/site-packages/flask/app.py", line 1968, in finalize_request
 response = self.make_response(rv)
 File "/home/xiang/.local/lib/python3.6/site-packages/flask/app.py", line 2112, in make_response
 rv = jsonify(rv)
 File "/home/xiang/.local/lib/python3.6/site-packages/flask/json/__init__.py", line 370, in jsonify
 dumps(data, indent=indent, separators=separators) + "
", File "/home/xiang/.local/lib/python3.6/site-packages/flask/json/__init__.py", line 211, in dumps rv = _json.dumps(obj, **kwargs) File "/home/xiang/.local/lib/python3.6/site-packages/simplejson/__init__.py", line 412, in dumps **kw).encode(obj) File "/home/xiang/.local/lib/python3.6/site-packages/simplejson/encoder.py", line 298, in encode chunks = list(chunks) File "/home/xiang/.local/lib/python3.6/site-packages/simplejson/encoder.py", line 696, in _iterencode for chunk in _iterencode_dict(o, _current_indent_level): File "/home/xiang/.local/lib/python3.6/site-packages/simplejson/encoder.py", line 652, in _iterencode_dict for chunk in chunks: File "/home/xiang/.local/lib/python3.6/site-packages/simplejson/encoder.py", line 716, in _iterencode o = _default(o) File "/home/xiang/.local/lib/python3.6/site-packages/flask/json/__init__.py", line 100, in default return _json.JSONEncoder.default(self, o) File "/home/xiang/.local/lib/python3.6/site-packages/simplejson/encoder.py", line 273, in default o.__class__.__name__) TypeError: Object of type ObjectId is not JSON serializable
이것 은 pymongo 가 삽입 작업 을 할 때 사전 에''가 없 으 면id',자동 으로 추 가 됩 니 다'id',그 값 은 ObjectId 인 스 턴 스 입 니 다.flask 는 반환 값 을 인 코딩 할 때 ObjectId 형식 인 스 턴 스 를 인 코딩 할 수 없 기 때문에 오 류 를 보고 합 니 다.해결 방법 은''을 제거 하 는 것 입 니 다.id'또는 my col.insertone(data.copy())

보충 지식:pymongo 리 셋:데 이 터 를 삽입 할 때 존재 하지 않 으 면 삽입 하고 존재 하면 실행 하지 않 습 니 다.
파충류 가 기어 오 르 는 데 이 터 를 mongoDB 에 저장 하려 고 할 때 자주 발생 하 는 수 요 는 삽 입 된 데이터 가 이미 데이터베이스 에 존재 하기 때문에 삽입 하기 전에 다시 하 는 것 이 일상적인 과제 이다.
내 생각 은:
만약 데이터베이스 에 이미 이 데이터 가 존재 한다 면,아무것도 조작 하지 않 을 것 이다.
데이터 가 존재 하지 않 으 면 이 데 이 터 를 삽입 합 니 다.
이 아 이 디 어 를 실현 하기 위해 많은 문헌 을 조사 한 결과 update 를 사용 하면 실현 할 수 있 음 을 발견 했다.
다음은 제 가 테스트 한 코드 입 니 다.

#             
document = {
  'p_id': 'f75046d73a0c4bf88f0b7342e60722c4',
  'c_name': 'Ken',
  'c_star': '5.0',
  'bought': None,
  'c_time': '2017 3 23 ',
  'c_userful': 13,
  'c_comment': ['4rになるトイプ`ドル に 。', ' までエサは に    きで えていましたが、  にむせていることがたびたび      ', '「もしかして べづらいのでは?」と い{べてみたところ、この  にたどり きました。', ' がLいので   は^が  に に いており、 や  に がかかっていたと われます。'],
  'gmt_create': datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
}
collection.insert(document)
mongoDB 시각 화 도 구 를 통 해 데이터 베 이 스 를 보 니 데이터 가 이미 존재 합 니 다.

존재 하지 않 으 면 삽입 합 니 다.존재 하지 않 으 면 삽입 하지 않 는 요 구 를 실현 하려 면 update 의 인 자 를 사용 해 야 합 니 다.'$setOnInsert'
$setOnInsert 공식 문서 보기 클릭
공식 문 서 를 읽 으 면$setOnInsert 방법 과 맞 추고 싶 은 가장 중요 한 매개 변 수 는 upset:True 라 는 것 을 알 수 있 습 니 다.
update 소스 코드 의 upsert 인 자 는 기본적으로 False 입 니 다.update 방법의 upsert 인 자 를 True 로 수정 하면 필요 한 효 과 를 얻 을 수 있 습 니까?
지금 우 리 는 같은 데이터 의 삽입 효 과 를 실행 합 니 다.

#              ,       gmt_create    ,          ,        
result_find = {
  'p_id': 'f75046d73a0c4bf88f0b7342e60722c4',
  'c_name': 'Ken',
  'c_star': '5.0',
  'bought': None,
  'c_time': '2017 3 23 ',
  'c_userful': 13,
  'c_comment': ['4rになるトイプ`ドル に 。', ' までエサは に    きで えていましたが、  にむせていることがたびたび      ',
         '「もしかして べづらいのでは?」と い{べてみたところ、この  にたどり きました。', ' がLいので   は^が  に に いており、 や  に がかかっていたと われます。']
}
#    update
collection.update(
  result_find,
  {'$setOnInsert': document},
  upsert=True
)
실행 이 끝 난 후에 데이터베이스 에 가서 보 니 원래 의 데이터 인지 하나 도 더 나 오지 않 았 다.존재 하면 조작 하지 않 는 요 구 를 실현 할 수 있다 는 것 을 설명 한다.
그렇다면 존재 하지 않 으 면 삽입 하 라 는 요 구 를 실현 할 수 있 을 까?
우 리 는 데이터베이스 시각 화 도구 에 가서 데이터베이스 에 있 는 데 이 터 를 삭제 한 후에 다음 작업 을 수행 합 니 다.

document = {
  'p_id': 'f75046d73a0c4bf88f0b7342e60722c4',
  'c_name': 'Ken',
  'c_star': '5.0',
  'bought': None,
  'c_time': '2017 3 23 ',
  'c_userful': 13,
  'c_comment': ['4rになるトイプ`ドル に 。', ' までエサは に    きで えていましたが、  にむせていることがたびたび      ', '「もしかして べづらいのでは?」と い{べてみたところ、この  にたどり きました。', ' がLいので   は^が  に に いており、 や  に がかかっていたと われます。'],
  'gmt_create': datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
}

result_find = {
  'p_id': 'f75046d73a0c4bf88f0b7342e60722c4',
  'c_name': 'Ken',
  'c_star': '5.0',
  'bought': None,
  'c_time': '2017 3 23 ',
  'c_userful': 13,
  'c_comment': ['4rになるトイプ`ドル に 。', ' までエサは に    きで えていましたが、  にむせていることがたびたび      ',
         '「もしかして べづらいのでは?」と い{べてみたところ、この  にたどり きました。', ' がLいので   は^が  に に いており、 や  に がかかっていたと われます。']
}

# collection.insert(document)
collection.update(
  result_find,
  {'$setOnInsert': document},
  upsert=True
)
그리고 우 리 는 데이터 에 우리 가 보고 싶 은 이 데이터 가 나 온 것 을 발견 했다.
그래서 우리 의 요 구 를 실현 했다.존재 하면 조작 하지 않 고 존재 하지 않 으 면 삽입 했다.
이 글 은 Pymongo insert 를 해결 할 때 자동 으로 추 가 됩 니 다아 이 디 의 문 제 는 바로 편집장 이 여러분 에 게 공유 한 모든 내용 입 니 다.여러분 에 게 참고 가 되 고 저희 도 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기