Mongoose将文档作为基于键的数组数组来获取

我真的不知道如何构思这个问题,但是我拥有的是mongoose中的以下模式

new Schema({ gatewayId: { type: String, index: true }, timestamp: { type: Date, index: true }, curr_property:Number, curr_property_cost:Number, day_property:Number, day_property_cost: Number, curr_solar_generating: Number, curr_solar_export:Number, day_solar_generated:Number, day_solar_export:Number, curr_chan1:Number, curr_chan2:Number, curr_chan3:Number, day_chan1:Number, day_chan2:Number, day_chan3:Number },{ collection: 'owlelecmonitor' }); 

我希望能够查询集合中的所有文档,但是数据应按以下格式排列在数组中

 [ [{ gatewayId: 1, timestamp: time .... }, { gatewayId: 1, timestamp: time2 .... }], [{ gatewayId: 2, timestamp: time .... }, { gatewayId: 2, timestamp: time2 .... }], [{ gatewayId: 3, timestamp: time .... }, { gatewayId: 3, timestamp: time2 .... }] ]; 

有没有办法,我可以在mongoose这样做,而不是检索文件,并再次处理它们?

是的,这是可能的。 考虑下面的mongo shell中的聚合pipe道。 这使用一个由$group操作符组成的单一pipe道stream,通过gatewayId对所有文档进行分组,并创build另一个包含所有分组文档的数组字段。 这个额外的字段在系统variables$$ROOT上使用累加器操作符$push ,它返回当前正在聚集stream水线阶段处理的根文档,即顶层文档。

使用从aggregate()方法返回的cursor ,然后可以使用它的map()方法来创build所需的最终数组。 下面的mongo shell演示描述了上面的概念:

 var result = db.owlelecmonitor.aggregate([ { "$group": { "_id": "$gatewayId", "doc": { "$push": "$$ROOT" } } } ]).map(function (res){ return res.doc; }); printjson(result); 

这将输出到shell所需的结果。

为了在Mongoose中实现这个,使用下面的聚合stream水线构build器

 OwlelecMonitorModel .aggregate() .group({ "_id": "$gatewayId", "doc": { "$push": "$$ROOT" } }) .exec(function (err, result) { var res = result.map(function (r){return r.doc;}); console.log(res); });