首页 > 解决方案 > mongo insert_one 给出错误,但插入有效(仅弃用警告)

问题描述

我有以下 Python 代码。因为不推荐使用 insert(...),所以我想使用 insert_one(...)。但是后来我得到了错误,尽管文档已添加到集合中。

在下面的代码中,我将 insert_one(...) 更改为 insert(...) 它工作得很好,除了不推荐使用的警告。

# mongo.py
import uuid
import time

from flask import Flask
from flask import jsonify
from flask import request
from flask_restful import Api, Resource, reqparse
from flask_pymongo import PyMongo

app = Flask(__name__)
api = Api(app)

app.config['MONGO_DBNAME'] = 'hh_licence'
app.config['MONGO_URI'] = 'mongodb://localhost:27017/hh_licence'

mongo = PyMongo(app)
"""
  collection scheme:
    key           [uuid4]
    valid_till    [date]
    type          ['FREE', 'TRIAL', 'PAID', 'COURTESY']
    features      [document 
                      TRDR  [BOOLEAN]  
                      DN    [BOOLEAN]
                  ]
"""


class Licence(Resource):
  @staticmethod
  def post():
    # add a licence
    # body empty
    db = mongo.db.licence

    licence = {
      "key": str(uuid.uuid4()),
      "valid_till": time.time() + 1000 * 60 * 60 * 24 * 7,
      "type": "FREE",
      "features": {
        'TRDR': 'true',
        'DN': 'true',
      }
    }
    print(licence)
    licence_id = db.insert_one(licence)
    new_licence = db.find_one({'_id': licence_id})
    return {'key': licence["key"]}, 201


api.add_resource(Licence, "/licence")

app.run(debug=True)


* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 250-910-823
{'key': '14a415ed-e0db-41a3-bb40-54fead0e69ba', 'valid_till': 2206109464.648261, 'type': 'FREE', 'features': {'TRDR': 'true', 'DN': 'true'}}
127.0.0.1 - - [28/Sep/2020 18:11:04] "POST /licence HTTP/1.1" 500 -
Traceback (most recent call last):
[...]

  File "/Users/coenkuijpers/PycharmProjects/license_server/lib/python3.8/site-packages/pymongo/message.py", line 714, in _op_msg
    return _op_msg_uncompressed(
bson.errors.InvalidDocument: cannot encode object: <pymongo.results.InsertOneResult object at 0x108157e80>, of type: <class 'pymongo.results.InsertOneResult'>

标签: pythonmongodbflask

解决方案


在我的问题中,我错误地认为 insert_one(...) 方法调用了错误消息。

然而事实证明,是 find_one(...) 方法做了坏事。

发生这种情况是因为 insert 和 insert_one 返回不同类型的返回值。insert 只返回文档的 id,其中 insert_one 返回一个对象。

为了让代码工作,我不得不改变

new_licence = db.find_one({'_id': licence_id})

new_licence = db.find_one({'_id': licence_id.inserted_id})

推荐阅读