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

时间:2017-07-24 09:08:21

标签: node.js mongodb mongoose

我正在研究在服务器端使用NodeJS而将MongoDB作为数据库而将Mongoose作为ORM的应用程序。

以下是mongo collection中的文档。

{
  "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的文档):

db.processes.aggregate([
  {
    "$project": {
      "maxState": {
        "$max": "$process_status_progress.state.state_number"
      },
      "rec_id": 1,
      "process_id": 1
    }
  },
  {
    "$match": {
      "$or": [
        {
          "maxState": {
            "$lt": 9
          }
        }
      ]
    }
  }
])

这将返回以下输出:

  

{" rec_id":1494929214467," process_id":1494929214501,
  " maxState":3 }

" STATE_ERROR"对象将有键" error_message"和" error_details"如果处理过程中出现任何错误,那么" state_error"不会是空白。
对象将被添加到" process_status_progress"因为进程正在进一步处理。我刚才展示了上面的示例数据。因此,文档可能在" process_status_progress"数组字段。

如何从process_status_progress返回具有状态编号最大值的整个对象,state_error具有如下所示的任何数据?

  

{" rec_id":1494929214467," process_id":1494929214501,
  " maxState":3," maxStateObj":{       "州":{         " state_number":3,         " state_name":"步骤3"       },       " last_update_date":1499773508526,       " state_error":{" error_message" :"一些错误消息"," error_details" :{" key" :"价值"}}} }

这意味着我想获取最大状态(少于提供的状态编号。在这种情况下,它是9)的文档有错误并获取内部的对象" process_status_progress"以及。
我可以在单个Mongo查询中实现这一点,或者我必须获取数据然后编写循环以处理该数据吗?

0 个答案:

没有答案