说到人们我在这里想到逻辑只返回具有最低价值主张的每个项目,如果是json。
{
requester: "test",
orderitems: [
{
description: "testitem1",
proposals: [
{
company: "company1",
value: 10
},
{
company: "company2",
value: 5
}
]
}
]
}
答案 0 :(得分:0)
取决于您可用的MongoDB服务器版本:
使用MongoDB 3.4实现$indexOfArray
作为最短的方法:
db.getCollection('collection').aggregate([
{ "$addFields": {
"orderitems": {
"$map": {
"input": "$orderitems",
"as": "o",
"in": {
"description": "$$o.description",
"proposals": {
"$arrayElemAt": [
"$$o.proposals",
{ "$indexOfArray": [
"$$o.proposals.value",
{ "$min": "$$o.proposals.value" }
]}
]
}
}
}
}
}}
])
或者使用MongoDB 3.2,您可以$filter
并将第一个匹配元素与$arrayElemAt
一起使用:
db.getCollection('collection').aggregate([
{ "$addFields": {
"orderitems": {
"$map": {
"input": "$orderitems",
"as": "o",
"in": {
"description": "$$o.description",
"proposals": {
"$arrayElemAt": [
{ "$filter": {
"input": "$$o.proposals",
"cond": { "$eq": ["$$this.value",{ "$min": "$$o.proposals.value" }] }
}},
0
]
}
}
}
}
}}
])
老实说,尝试在任何低于此版本的版本中实施都会很痛苦。
基本原则是基于$min
返回的值进行匹配,它确实在MongoDB 3.2中进行了更改,因此它可用于从任何值数组返回“最小”值,而不仅仅是聚合$group
在版本3.2中更改:$ min在$ group和$ project阶段可用。在早期版本的MongoDB中,$ min仅在$ group阶段可用。
因此,一般情况是我们通过匹配的$indexOfArray
索引或者作为$filter
的匹配数组条目返回的值返回值来匹配数组条目。
根据所选方法,将“匹配索引”提供给$arrayElemAt
以提取该索引处的数组值,或者使用0
索引从中获取“第一个”元素“过滤后的清单”。
任何一种方法都会返回:
{
"requester" : "test",
"orderitems" : [
{
"description" : "testitem1",
"proposals" : {
"company" : "company2",
"value" : 5.0
}
}
]
}