Node.js Mongo在对象数组中查找属性的最大值并返回整个匹配对象
我正在开发一个应用程序,服务器端有NodeJS,数据库是MongoDB,ORM是Mongoose 以下是我在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"
{
"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
}
}
]
}
}
])