Node.js Mongo在对象数组中查找属性的最大值并返回整个匹配对象

Node.js Mongo在对象数组中查找属性的最大值并返回整个匹配对象,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我正在开发一个应用程序,服务器端有NodeJS,数据库是MongoDB,ORM是Mongoose 以下是我在mongo收藏中的文档 { "rec_id": 73282, "process_id": 73272, "is_cancelled": false, "process_status_progress": [ { "state": { "state_number": 1, "state_name": "Step 1"

我正在开发一个应用程序,服务器端有NodeJS,数据库是MongoDB,ORM是Mongoose

以下是我在mongo收藏中的文档

{
  "rec_id": 73282,
  "process_id": 73272,
  "is_cancelled": false,
  "process_status_progress": [
    {
      "state": {
        "state_number": 1,
        "state_name": "Step 1"
      },
      "last_update_date": 1499773230587,
      "state_error": {}
    },
    {
      "state": {
        "state_number": 2,
        "state_name": "Step 2"
      },
      "last_update_date": 1499773246295,
      "state_error": {}
    },
    {
      "state": {
        "state_number": 3,
        "state_name": "Step 3"
      },
      "last_update_date": 1499773508526,
      "state_error": {
        "error_message": "Some error message",
        "error_details": {
          "key": "value"
        }
      }
    }
  ],
  "job_status": "Step 3"
}
我正在执行以下查询(选择最大进度状态小于状态编号9的文档):

这将返回以下输出:

{“记录id”:1494929214467,“进程id”:1494929214501,
“maxState”:3}

“state\u error”对象将具有键“error\u message”和“error\u details”,如果处理时该状态中存在任何错误,“state\u error”将不为空。
随着流程的进一步处理,对象将添加到“流程\状态\进度”中。我刚刚展示了上面的示例数据。所以文档在“进程\状态\进度”数组字段中可能有更多的对象。

我怎样才能从
process\u status\u progress
返回整个对象,其中state number和
state\u error的值最大,并且
state\u error有如下数据?

{“记录id”:1494929214467,“进程id”:1494929214501,
“maxState”:3,“maxStateObj”:{ “国家”:{ “州编号”:3, “状态名称”:“步骤3” }, “上次更新日期”:1499773508526, “状态错误”:{“错误消息”:“某些错误消息”,“错误详细信息”:{“键”:“值”}}}}

这意味着我想获取max state(小于提供的state number。在本例中,它是9)出错的文档,并获取“process\u status\u progress”中的对象。

我可以在单个Mongo查询中实现这一点,还是必须获取数据,然后编写循环来处理该数据?

有数据的“状态错误”是什么意思?您的样品中的所有项目都是相同的,因此不确定您的意思。“state_number”的“max”看起来只是“最后一个数组元素”。这意味着除非有某种原因,否则它不应该总是这样,那么你真的不需要
$max
,只需要返回“数组中的最后一个元素”。@NeilLunn:“state\u error”有任何数据意味着它有“error\u message”和“error\u details”键。max state并不总是“最后一个数组元素”。我已经更新了问题并添加了更多细节。你明白我想解释的吗?抱歉英语不好。关于“有任何数据的状态错误”仍然非常不清楚。这是什么意思??
“state_error”:{}
与示例中的一样,可以吗?或者它应该有类似于
“state_error”:{“key”:“something”}
?我们怎么知道呢?是否会出现“固定密钥名称”?或者可能是什么?您可以使用哪个MongoDB服务器版本?对您的问题没有帮助的是,由于我可以最好地解释您的意图,您提供的任何数据实际上都不符合您要求的条件。因此,通常最好显示至少一个选择的多个数据,这些数据“确实”符合您想要的条件。因此,这将是返回的结果。如果你没有显示匹配项,那么人们(比如我)不确定你想要的结果是否就是我们选择的结果。如果你把它展示出来,那么我们肯定知道。@NeilLunn:请检查更新的问题。
db.processes.aggregate([
  {
    "$project": {
      "maxState": {
        "$max": "$process_status_progress.state.state_number"
      },
      "rec_id": 1,
      "process_id": 1
    }
  },
  {
    "$match": {
      "$or": [
        {
          "maxState": {
            "$lt": 9
          }
        }
      ]
    }
  }
])