Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 修改猫鼬响应数据_Node.js_Mongodb_Mongoose - Fatal编程技术网

Node.js 修改猫鼬响应数据

Node.js 修改猫鼬响应数据,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我有一个API调用,它以JSON的形式返回用户收到的所有消息 模型数据如下所示: { sender: ObjectId, reciever: ObjectId, message: String } 修改API响应的JSON的正确方法是什么 我希望最后的数据分组如下: { <senderid>:[ all of the messages from this sender], <other_sender>:[ all of the m

我有一个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执行此操作?

使用聚合框架将非常适合此任务。您可以运行以下聚合管道,该管道使用操作符步骤对数据进行分组以处理它们。group pipeline运算符类似于SQL的group BY子句。在SQL中,除非使用任何聚合函数,否则不能使用GROUPBY。同样,您也必须在MongoDB中使用聚合函数。在本例中,使用累加器操作符创建消息数组

由于返回普通对象,因此您可以使用lodash library的方法将结果数组转换为所需的哈希键:

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数据=[
{{u id:'user1',消息:['msg1','msg2']},
{{u id:'user2',消息:['msg3','msg1']},
{{u id:'user3',消息:['msg6','msg3']},
{{u id:'user4',消息:['msg4','msg8']}
];
var hashmap=\链(数据)
.indexBy(“id”)
.mapValues(“消息”)
.tap(日志)
.value();
函数日志(值){
pre.innerHTML+=JSON.stringify(值,null,4)+“\n”
}


您应该使用mongodb aggreagationI我已经研究了聚合,但我似乎不知道如何在保持原始字段不变的情况下聚合数据。如果可以,您应该添加API代码,它在API级别,您可以进行更改,并按照您想要的方式塑造返回的数据。