MongoDB,Flask与$ unwind查询聚合 - python

语境
我有一个使用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 = 1frame_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”变成…