2017-01-01 38 views
1

我的函数如下所示。如何在MongoDB中进行聚合操作时限制输出中的列数

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已被添加为子文档。但是我希望将该列添加到同一个文档中作为一个字段,而不是作为子文档的一部分。准确地说,我不希望批处理和光标字段出现。请帮忙。

+0

为了澄清,我想改变的文件是这样的: –

+0

为了澄清,我想改变的文件是这样的:{ “_id”:物件(“5860a2237796484df5656e0c”), “状态”: “西孟加拉邦”, “SO2”:10, “NO2”:40, “RSPM/PM10”:138, “PM 2.5”:83, “SO2MaxQuantity”:153 } –

回答

1

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

一旦你得到这个值,你可以使用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"); 
+1

嗨Chridam,很好的逻辑..它工作..我只是修复了一点语法错误..感谢您的帮助..你是一个超级明星:) –

相关问题