修改mongoose响应数据

我有一个API调用,返回用户收到的所有消息为JSON。

模型数据如下所示:

{ sender: ObjectId, reciever: ObjectId, message: String } 

修改API响应的JSON的正确方法是什么?

我想结束数据分组,如下所示:

 { <senderid>:[ all of the messages from this sender], <other_sender>:[ all of the messages from this sender] } 

我必须在javascript中手动执行此操作,还是有更快的方法来利用mongoose做到这一点?

使用聚合框架将是这个任务的理想select。 您可以运行以下使用$group操作步骤的聚合pipe道来对数据进行分组来处理它们。 组pipe道运算符类似于SQL的GROUP BY子句。 在SQL中,除非使用任何聚合函数,否则不能使用GROUP BY。 同样的,你也必须在MongoDB中使用一个聚合函数。 在这种情况下,使用$push accumulator操作符来创build消息数组。

由于Model.aggregate()返回普通对象,因此使用lodash库的_.indexBy()方法将结果数组转换为所需的散列键:

 var pipeline = [ { "$group": { "_id": "$sender", "messages": { "$push": "$message" } } } ]; Model.aggregate(pipeline, function(err, res) { if (err) return handleError(err); var hashmap = _.chain(res) .indexBy('_id') .mapValues('messages') .value(); console.log(JSON.stringify(hashmap, undefined, 4)); } ); // Or use the aggregation pipeline builder. Model.aggregate() .group({ "_id": "$sender", "messages": { "$push": "$message" } }) .exec(function (err, res) { if (err) return handleError(err); var hashmap = _.chain(res) .indexBy('_id') .mapValues('messages') .value(); console.log(JSON.stringify(hashmap, undefined, 4)); }); 

检查下面的演示。

 var data = [ { _id: 'user1', messages: ['msg1', 'msg2'] }, { _id: 'user2', messages: ['msg3', 'msg1'] }, { _id: 'user3', messages: ['msg6', 'msg3'] }, { _id: 'user4', messages: ['msg4', 'msg8'] } ]; var hashmap = _.chain(data) .indexBy('_id') .mapValues('messages') .tap(log) .value(); function log(value) { pre.innerHTML += JSON.stringify(value, null, 4) + "\n" } 
 <script src="//cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.1/lodash.min.js"></script> <pre id="pre"></pre>