语境
我有一个使用pymongo连接到MongoDB的Flask应用程序。当前,数据库以以下格式包含有关运行的数据:
{
"_id": {
"$oid": "5df031cec687bf2b4c4349b9"
},
"run_number": "1",
"frames": [{
"frame_number": 1,
"data": {
"brake": "0.1",
"steer": "0.4",
"throttle": "0.6"
}
}, {
"frame_number": 2,
"data": {
"brake": "0.2",
"steer": "0.8",
"throttle": "0.6"
}
}, {
"frame_number": 3,
"data": {
"brake": "0.6",
"steer": "0.2",
"throttle": "0.1"
}
}]
}
我可以使用此端点检索特定运行的所有数据:
@app.route('/pitcrew-purple/api/v1/<run_number>/')
def get_run(run_number):
if run_number:
data = []
for i in mongodb.pitcrewdb.find({"run_number": run_number}):
i.pop('_id')
data.append(i)
if not data:
return "No data was found for run number {}".format(run_number), 400
return jsonify(data), 200
return "No run_number was given", 400
问题
我正在Flask API端点上工作,它将从某个run_number返回所有数据,其中frame_number大于或等于给定的帧号。
因此,当给出run_number = 1
和frame_number = 2
作为输入时,应该检索运行编号1中帧号> = 2的所有数据。
我是MongoDB的新手,已经阅读了文档,但是无法从数据库中获取所需的数据。
我尝试了什么
我试图通过此端点检索所需的数据
@app.route('/pitcrew-purple/api/v1/<run_number>/<start_frame_number>/')
def get_rundata_from_start_frame(run_number, start_frame_number):
if run_number and start_frame_number:
data = []
query = mongodb.pitcrewdb.find(
{"run_number": run_number, "frames.frame_number": {"$gte": start_frame_number}}
)
for i in query:
i.pop("frames.frame_number")
data.append(i)
if not data:
return "The specified data starting from frame number: {} was not found".format(start_frame_number), 400
return jsonify(data), 200
return "No parameters were given", 400
我还尝试用i.pop("frames.frame_number")
替换i.pop("_id")
,但是这两个结果均导致“从帧号开始的指定数据:2未找到”。
为了从MongoDB中检索所需的数据,我应该更改什么?
编辑预期输出
"run_number": "1",
"frames": [{
{
"frame_number": 2,
"data": {
"brake": "0.2",
"steer": "0.8",
"throttle": "0.6"
}
}, {
"frame_number": 3,
"data": {
"brake": "0.6",
"steer": "0.2",
"throttle": "0.1"
}
}]
参考方案
您可以通过使用$unwind
然后使用$group
和$push
来实现,如下所示:
db.pitcrewdb.aggregate([
{
"$match": {
"run_number": "1",
"frames.frame_number": {
"$gte": 2
}
}
},
{
"$project": {
"_id": 0
}
},
{
"$unwind": "$frames"
},
{
"$match": {
"frames.frame_number": {
"$gte": 2
}
}
},
{
"$group": {
"_id": "$run_number",
"frames": {
"$push": "$frames"
}
}
}
])
$unwind
将破坏数组,然后过滤结果,并在$group
之后再次
或者您也可以使用$filter
db.pitcrewdb.aggregate([
{
"$match": {
"run_number": "1"
}
},
{
"$project": {
"_id": 0,
"frames": {
$filter: {
input: "$frames",
as: "frame",
cond: {
$gte: [
"$$frame.frame_number",
2
]
}
}
}
}
}
])
Python-crontab模块 - python我正在尝试在Linux OS(CentOS 7)上使用Python-crontab模块我的配置文件如下:{ "ossConfigurationData": { "work1": [ { "cronInterval": "0 0 0 1 1 ?", "attribute&…
Python Pandas导出数据 - python我正在使用python pandas处理一些数据。我已使用以下代码将数据导出到excel文件。writer = pd.ExcelWriter('Data.xlsx'); wrong_data.to_excel(writer,"Names which are wrong", index = False); writer.…
Python:在不更改段落顺序的情况下在文件的每个段落中反向单词? - python我想通过反转text_in.txt文件中的单词来生成text_out.txt文件,如下所示:text_in.txt具有两段,如下所示:Hello world, I am Here. I am eighteen years old. text_out.txt应该是这样的:Here. am I world, Hello old. years eighteen a…
每个文件合并后添加换行 - python我有很多类似以下内容的JSON文件:例如。1.json{"name": "one", "description": "testDescription...", "comment": ""} test.json{"name"…
用大写字母拆分字符串,但忽略AAA Python Regex - python我的正则表达式:vendor = "MyNameIsJoe. I'mWorkerInAAAinc." ven = re.split(r'(?<=[a-z])[A-Z]|[A-Z](?=[a-z])', vendor) 以大写字母分割字符串,例如:'我的名字是乔。 I'mWorkerInAAAinc”变成…