如何在Mongo DB中进行聚合操作时限制输出中的列数

时间:2017-01-01 17:48:23

标签: mongodb mongodb-query aggregation-framework

我的功能如下所示。

function (x)       
{
var SO2Min = db.AirPollution.aggregate(
[

 {
    $match : {"SO2":{$ne:'NA'}, "State":{$eq: x} }
},
 {
   $group:
     {
       _id: x,
       SO2MinQuantity: { $min: "$SO2" }
     }
 },
 {
     $project:
       {SO2MinQuantity: '$SO2MinQuantity'
       }
   }
 ] 
)  
db.AirPollution.update
(
 {
   "State": "West Bengal"},
 { 
    $set: {
     "MaxSO2": SO2Max
  }
},
 {
   "multi": true
}
 );   
 }

在这里,AirPolltuion是我的收藏品。如果我运行此函数,则使用新列MaxSO2更新集合,如下所示。

{
"_id" : ObjectId("5860a2237796484df5656e0c"),
"Stn Code" : 11,
"Sampling Date" : "02/01/15",
"State" : "West Bengal",
"City/Town/Village/Area" : "Howrah",
"Location of Monitoring Station" : "Bator, Howrah",
"Agency" : "West Bengal State Pollution Control Board",
"Type of Location" : "Residential, Rural and other Areas",
"SO2" : 10,
"NO2" : 40,
"RSPM/PM10" : 138,
"PM 2.5" : 83,
"MaxSO2" : {
    "_batch" : [ 
        {
            "_id" : "West Bengal",
            "SO2MaxQuantity" : 153
        }
    ],
    "_cursor" : {}
   }
  }

我们可以看到,MaxSO2已被添加为子文档。但我希望该列作为字段添加到同一文档中,而不是作为子文档的一部分。确切地说,我不希望批量和光标字段出现。请帮忙。

1 个答案:

答案 0 :(得分:1)

由于聚合函数返回游标,您可以使用 toArray() 方法返回一个包含游标中所有文档的数组,然后访问聚合字段。因为要从聚合返回单个值,所以不需要迭代结果数组,只需访问结果中的第一个且唯一的单个文档来获取值。

获得此值后,您可以使用 updateMany() 方法更新您的收藏集。因此,您可以将代码重构为:

function updateMinAndMax(x) {
    var results = db.AirPollution.aggregate([
        { 
            "$match" : { 
                "SO2": { "$ne": 'NA' }, 
                "State": { "$eq": x } 
            }
        },
        {
            "$group": {
                "_id": x,
                "SO2MinQuantity": { "$min": "$SO2" },
                "SO2MaxQuantity": { "$max": "$SO2" }
            }
        },
    ]).toArray();
    var SO2Min = results[0]["SO2MinQuantity"];
    var SO2Max = results[0]["SO2MaxQuantity"];

    db.AirPollution.updateMany(
        { "State": x },
        { "$set": { "SO2MinQuantity": SO2Min, "SO2MaxQuantity": SO2Max } },
    );   
}
updateMinAndMax("West Bengal");