python - 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'>
解决方案
在我的问题中,我错误地认为 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})
推荐阅读
- telnet - 捕获 telnet 密码 tcpdump
- r - 使用r中的for循环重新调整具有给定不同参考水平的许多变量
- android-studio - 应用程序无法正确启动 (0xc0000005)。单击确定关闭应用程序
- java - 我无法解析通过 RabbitMQ 发送的协议缓冲区
- java - 如何在java中使用sql函数作为带有where条件的查询
- ansible - 循环时,Ansible 仅在包含的剧本中运行一次任务
- node.js - 我希望仅使用 execSync 或 eval 可能的东西将 git 存储库克隆到新计算机
- r - 如何在 data.frame 列中重复 n 次字符串
- quickbooks - 我无法在 quickbooks/v3-php-sdk 的 JournalEntryLineDetail 实体中正确设置 Customer 参数?
- apache-flink - 尝试访问或读取 Apache Flink 中 KeyedBroadCastProcessFunction 中 processElement 方法中的 ReadOnly ctx 时出现 NullPointer 异常