当前位置: 首页 > 知识库问答 >
问题:

修改猫鼬的反应数据

印季
2023-03-14

我有一个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中手动执行此操作吗,或者是否有更快的方法利用猫鼬来执行此操作?

共有1个答案

云联
2023-03-14

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

因为模型。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>
 类似资料:
  • 问题内容: 我有一个猫鼬模型: 我想找到一个模型实例,修改它的属性,然后保存更改。这是我尝试过的(这是错误的!): 查找,修改和保存模型实例的语法是什么? 问题答案: 为什么不使用Model.update?毕竟,除了更新其属性之外,您没有将找到的用户用于其他任何用途:

  • 问题内容: 当我尝试更改猫鼬查询返回的数据的任何部分时,它均无效。 昨天,我尝试使用各种s,使用临时存储变量等来解决大约2个小时的问题。最后,就在我发疯的时候,我找到了解决方案。因此,我认为将来有人(保存!)可能会出现保存问题。 问题答案: 对于需要普通JS对象而不是完整模型实例的情况,可以在查询链上调用,如下所示: 这种方式已经是一个普通的JS对象,您可以根据需要对其进行操作。

  • 我需要将一个数组中的对象推入数据库,但我得到了一个错误。我做错了什么?我发现这样一个话题,通过猫鼬将物品推入mongo数组却无法正确应用.............................................................. 当我尝试这个代码时,我得到了这个答案 MongooseError:文档在保存前必须有_ID

  • 问题内容: 在我正在处理的集合中,文档如下所示: 我写了这个Mongoose模式来访问它: 当我查询文档时,一切正常,控制台中显示的输出正确。但是当我尝试执行console.log(myDoc.stuff)时,得到了以下信息: 代替 我究竟做错了什么?谢谢您的帮助!! 问题答案: 免责声明:此回复的日期过早,2012年!这可能不是最准确的。 从猫鼬的文档。 http://mongoosejs.co

  • 问题内容: 我从Mongoose网站上阅读了快速入门,几乎复制了代码,但是无法使用Node.js连接MongoDB。 这是我的代码。控制台仅打印,不打印。我哪里错了? 问题答案: 调用时,它将建立与数据库的连接。 但是,您在以后的某个时间点(处理请求时)附加了事件侦听器,这意味着该连接可能已经处于活动状态,并且该事件已经被调用(您尚未监听它)。 。 您应该重新排列代码,以使事件处理程序尽可能(及时

  • 问题内容: 假设以下3个模型: 当我查询汽车时,我可以填充零件: 猫鼬是否有办法在所有汽车的嵌套零件对象中填充otherIds。 我可能可以遍历每辆车并尝试填充: 问题是我必须使用一个像async这样的库来对每个对象进行填充调用,然后等到所有操作完成后再返回。 可以在不循环所有汽车的情况下做? 问题答案: 更新: 请参阅以获取在Mongoose 4中添加的更紧凑的版本。摘要如下: 猫鼬3及以下: