返回内部数组中具有最低值的每个项目

时间:2017-09-13 09:40:37

标签: mongodb aggregation-framework

说到人们我在这里想到逻辑只返回具有最低价值主张的每个项目,如果是json。

{
 requester: "test",
 orderitems: [ 
                 {
                   description: "testitem1",
                   proposals: [
                                 {
                                   company: "company1",
                                   value: 10
                                 },
                                 {
                                   company: "company2",
                                   value: 5
                                 }
                   ]
                 }
]
}

1 个答案:

答案 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
            }
        }
    ]
}