修改猫鼬响应数据

Posted

技术标签:

【中文标题】修改猫鼬响应数据【英文标题】:Modify mongoose response data 【发布时间】:2016-05-05 12:38:25 【问题描述】:

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

【问题讨论】:

你应该使用 mongodb 聚合 我已经研究过聚合,但我似乎无法弄清楚如何在保持原始字段不变的同时聚合数据。 如果可以,您应该添加您的 API 代码,在 API 级别您可以进行更改并按照您想要的方式调整返回的数据。 【参考方案1】:

使用聚合框架将是此任务的理想选择。您可以运行以下聚合管道,该管道利用 $group 运算符步骤对数据进行分组以处理它们。组管道运算符类似于 SQL 的 GROUP BY 子句。在 SQL 中,除非您使用任何聚合函数,否则您不能使用 GROUP BY。同样,您也必须在 MongoDB 中使用聚合函数。在这种情况下,使用 $push 累加器运算符来创建消息数组。

由于 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>

【讨论】:

以上是关于修改猫鼬响应数据的主要内容,如果未能解决你的问题,请参考以下文章

使用猫鼬处理并发修改

修改猫鼬对象文字结果不起作用[重复]

在猫鼬中实现用户可修改模式

从精益查询的结果创建猫鼬模型

我是猫鼬的新手。我想通过添加作为另一个模式的值的字段来修改现有模式?

没有得到猫鼬模型的响应。find()查询