折腾:
【记录】用Flask实现测评系统的后端
期间,
需要实现MongoDB中,random随机获取一个,evaluation.question的collection
之前知道有find和find_one,但是只想要获取随机的一个
mongodb find return random
// Get one random document from the mycoll collection. db.mycoll.aggregate([{ $sample: { size: 1 } }])
先去本地mongo命令行中试试
➜ mongodb mongo MongoDB shell version v3.6.3 connecting to: mongodb://127.0.0.1:27017 MongoDB server version: 3.6.3 Server has startup warnings: 2018-12-19T17:51:17.268+0800 I CONTROL [initandlisten] 2018-12-19T17:51:17.268+0800 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database. 2018-12-19T17:51:17.268+0800 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted. 2018-12-19T17:51:17.268+0800 I CONTROL [initandlisten] 2018-12-19T17:51:17.268+0800 I CONTROL [initandlisten] ** WARNING: This server is bound to localhost. 2018-12-19T17:51:17.268+0800 I CONTROL [initandlisten] ** Remote systems will be unable to connect to this server. 2018-12-19T17:51:17.268+0800 I CONTROL [initandlisten] ** Start the server with --bind_ip <address> to specify which IP 2018-12-19T17:51:17.268+0800 I CONTROL [initandlisten] ** addresses it should serve responses from, or with --bind_ip_all to 2018-12-19T17:51:17.268+0800 I CONTROL [initandlisten] ** bind to all interfaces. If this behavior is desired, start the 2018-12-19T17:51:17.268+0800 I CONTROL [initandlisten] ** server with --bind_ip 127.0.0.1 to disable this warning. 2018-12-19T17:51:17.268+0800 I CONTROL [initandlisten] > show databases Scholastic 0.039GB admin 0.000GB config 0.000GB dialog 0.272GB evaluation 0.000GB gridfs 13.792GB local 0.000GB log 0.000GB storybook 0.101GB test 0.000GB > use evaluation switched to db evaluation > show collections question > db.question.aggregate([{$sample: {size: 1}}]) { "_id" : ObjectId("5c1777e1cc6df4563adf4b7e"), "question_number" : 304, "major_type" : "单选", "stem_text" : "When will the party start?", "max_answer_time" : 30, "difficulty" : "1.2", "audio_length" : 0, "ave_answer_time" : 15, "sub_questions" : [ { "option_type" : "text", "question_texts" : [ "" ], "options" : [ { "option_number" : 1, "option_image" : "", "option_text" : "In the morning." }, { "option_number" : 2, "option_image" : "", "option_text" : "In the evening." }, { "option_number" : 3, "option_image" : "", "option_text" : "At night." } ], "correct_option" : [ 2 ] } ], "checkpoint" : [ "reading", "general_reading", "句子理解", "", "" ], "stem_image" : "image/party board.png", "audio" : "", "audio_text" : "", "stem_type" : "mix" } > db.question.aggregate([{$sample: {size: 1}}]).pretty function () { this._prettyShell = true; return this; } > db.question.aggregate([{$sample: {size: 1}}]).pretty() { "_id" : ObjectId("5c1777e2cc6df4563adf4cd1"), "question_number" : 643, "major_type" : "单选", "stem_text" : "Who ___ you maths last Sunday?", "max_answer_time" : 10, "difficulty" : 2, "audio_length" : 0, "ave_answer_time" : 5, "sub_questions" : [ { "option_type" : "text", "question_texts" : [ "" ], "options" : [ { "option_number" : 1, "option_image" : "", "option_text" : "taught" }, { "option_number" : 2, "option_image" : "", "option_text" : "teaches" }, { "option_number" : 3, "option_image" : "", "option_text" : "teach" } ], "correct_option" : [ 1 ] } ], "checkpoint" : [ "reading", "grammar", "", "", "" ], "stem_image" : "", "audio" : "", "audio_text" : "", "stem_type" : "text" } >
再去pymongo中试试是否支持
pymongo aggregate
需要PyMongo版本>= 2.1.0
去看看此处版本
Pipfile
中只有:
flask-pymongo = "*"
没有版本,去看看pipenv graph
➜ EvaluationSystemServer git:(master) pipenv graph Flask-Cors==3.0.7 - Flask [required: >=0.9, installed: 1.0.2] - click [required: >=5.1, installed: 7.0] - itsdangerous [required: >=0.24, installed: 1.1.0] - Jinja2 [required: >=2.10, installed: 2.10] - MarkupSafe [required: >=0.23, installed: 1.1.0] - Werkzeug [required: >=0.14, installed: 0.14.1] - Six [required: Any, installed: 1.12.0] Flask-PyMongo==2.2.0 - Flask [required: >=0.11, installed: 1.0.2] - click [required: >=5.1, installed: 7.0] - itsdangerous [required: >=0.24, installed: 1.1.0] - Jinja2 [required: >=2.10, installed: 2.10] - MarkupSafe [required: >=0.23, installed: 1.1.0] - Werkzeug [required: >=0.14, installed: 0.14.1] - PyMongo [required: >=3.0, installed: 3.7.2] Flask-RESTful==0.3.7 - aniso8601 [required: >=0.82, installed: 4.0.1] - Flask [required: >=0.8, installed: 1.0.2] - click [required: >=5.1, installed: 7.0] - itsdangerous [required: >=0.24, installed: 1.1.0] - Jinja2 [required: >=2.10, installed: 2.10] - MarkupSafe [required: >=0.23, installed: 1.1.0] - Werkzeug [required: >=0.14, installed: 0.14.1] - pytz [required: Any, installed: 2018.7] - six [required: >=1.3.0, installed: 1.12.0] gevent==1.3.7 - greenlet [required: >=0.4.14, installed: 0.4.15] gunicorn==19.9.0 python-dotenv==0.10.1
Flask-PyMongo==2.2.0
符合要求
“Note
aggregate requires server version >= 2.1.0. The PyMongo aggregate() helper requires PyMongo version >= 2.3.”
不清楚到底是否支持了。
先去试试再说
此处有点诧异:
为何pymongo有2.7.2和3.7.2,都很新的版本
但是此处为何只有2.2.0啊
才想起来:Flask-PyMongo和pymongo 不是同一个吧?
搜:Flask-PyMongo
才注意到是:
Flask-PyMongo==2.2.0 ... - PyMongo [required: >=3.0, installed: 3.7.2]
即:
- Flask-PyMongo:2.2.0
- PyMongo:3.7.2
都是最新的,不用担心版本问题。
没找到aggregate
用代码:
# for debug randomPipline = [{ "$sample" : { "size": 1 } }] log.debug("randomPipline=%s", randomPipline) randomQuestion = questionCollection.aggregate(pipeline=randomPipline) log.debug("randomQuestion=%s", randomQuestion) randomQuestionType = type(randomQuestion) log.debug("randomQuestionType=%s", randomQuestionType)
得到的是:
randomPipline=[{'$sample': {'size': 1}}] randomQuestion=<pymongo.command_cursor.CommandCursor object at 0x1082eb320> randomQuestionType=<class 'pymongo.command_cursor.CommandCursor'>
再看看怎么得到record
参考:
去加上: list()
“x=db.test.aggregate(aggregation_string)
print x
for r in x:
min_age=r.items()[0]
print(min_age[1]) #######output: 20”
【总结】
最后用代码:
randomPipline = [{ "$sample" : { "size": 1 } }] log.debug("randomPipline=%s", randomPipline) randomQuestionCursor = questionCollection.aggregate(pipeline=randomPipline) log.debug("randomQuestionCursor=%s", randomQuestionCursor) randomQuestionType = type(randomQuestionCursor) log.debug("randomQuestionType=%s", randomQuestionType) randomQuestionList = list(randomQuestionCursor) log.debug("randomQuestionList=%s", randomQuestionList) randomQuestion = randomQuestionList[0] log.debug("randomQuestion=%s", randomQuestion) randomQuestionId = str(randomQuestion["_id"]) log.debug("randomQuestionId=%s", randomQuestionId) randomQuestion.pop("_id") log.debug("randomQuestion=%s", randomQuestion) randomQuestion["_id"] = randomQuestionId log.debug("randomQuestion=%s", randomQuestion) respDict["message"] = "Get next question ok" respDict["data"] = randomQuestion return jsonify(respDict)
可以得到想要的随机出来的单个record:
evaluation.py:117 get] randomPipline=[{'$sample': {'size': 1}}] evaluation.py:119 get] randomQuestionCursor=<pymongo.command_cursor.CommandCursor object at 0x109e59860> evaluation.py:121 get] randomQuestionType=<class 'pymongo.command_cursor.CommandCursor'> evaluation.py:123 get] randomQuestionList=[{'_id': ObjectId('5c1777e1cc6df4563adf4aa6'), 'question_number': 88, ..., 'stem_type': 'empty'}] evaluation.py:125 get] randomQuestion={'_id': ObjectId('5c1777e1cc6df4563adf4aa6'), 'question_number': 88, ... 'stem_type': 'empty'} evaluation.py:128 get] randomQuestionId=5c1777e1cc6df4563adf4aa6 evaluation.py:130 get] randomQuestion={'question_number': 88, ... 'stem_type': 'empty'} evaluation.py:132 get] randomQuestion={'question_number': 88, ... 'stem_type': 'empty', '_id': '5c1777e1cc6df4563adf4aa6'}
postman测试的flask的接口返回结果效果
转载请注明:在路上 » 【已解决】Python的pymongo中随机输出一个集合的记录