Node.js Mongoose/Mongodb mapReduce或通过单个字段聚合到组
在我的Node.js Mongoose/Mongodb mapReduce或通过单个字段聚合到组,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,在我的conversations收藏中,我有一些以下格式的文档,可以在多人之间进行聊天。threadId保存2之间对话中一个用户的id 51c0c35b7daabc3410000001和51c0c35b7daabc341000002 { "from" : ObjectId("51c0c35b7daabc3410000001"), "to" : ObjectId("51c0c35b7daabc3410000002"), "threadId" : ObjectId("51c
conversations
收藏中,我有一些以下格式的文档,可以在多人之间进行聊天。threadId保存2之间对话中一个用户的id
51c0c35b7daabc3410000001
和51c0c35b7daabc341000002
{
"from" : ObjectId("51c0c35b7daabc3410000001"),
"to" : ObjectId("51c0c35b7daabc3410000002"),
"threadId" : ObjectId("51c0c35b7daabc3410000002"),
"message" : "Hi there!"
}
{
"from" : ObjectId("51c0c35b7daabc3410000002"),
"to" : ObjectId("51c0c35b7daabc3410000001"),
"threadId" : ObjectId("51c0c35b7daabc3410000002"),
"message" : "How are you?"
}
{
"from" : ObjectId("51c0c35b7daabc3410000001"),
"to" : ObjectId("51c0c35b7daabc3410000002"),
"threadId" : ObjectId("51c0c35b7daabc3410000002"),
"message" : "I am good. How are you?"
}
51c0c35b7daabc3410000001
和51c0c69989a44a681200003
{
"from" : ObjectId("51c0c35b7daabc3410000001"),
"to" : ObjectId("51c0c69989a44a6812000003"),
"threadId" : ObjectId("51c0c69989a44a6812000003"),
"message" : "Hello!"
}
{
"from" : ObjectId("51c0c69989a44a6812000003"),
"to" : ObjectId("51c0c35b7daabc3410000001"),
"threadId" : ObjectId("51c0c69989a44a6812000003"),
"message" : "Hey.."
}
我想根据threadId进行分组,输出的形式应该是
{
"from" : ObjectId("51c0c35b7daabc3410000001"),
"to" : ObjectId("51c0c35b7daabc3410000002"),
"threadId" : ObjectId("51c0c35b7daabc3410000002"),
"message" : "I am good. How are you?"
}
{
"from" : ObjectId("51c0c69989a44a6812000003"),
"to" : ObjectId("51c0c35b7daabc3410000001"),
"threadId" : ObjectId("51c0c69989a44a6812000003"),
"message" : "Hey.."
}
因此,我想查找具有不同threadId(或仅基于threadId的组)的所有文档。输出还应包括文档中的所有其他字段
mapReduce、聚合/组、独特还是这些的组合?我该怎么做呢
编辑
要将其放在SQL语句中,我需要如下简单内容
按线程ID从对话组中选择* 我最后做了这个
// Aggregate pipeline
Conversation.aggregate(
{ $match: {
listing: new ObjectId(listingId)
}
},
{ $group: {
_id: '$threadId',
message: { $last: "$message" },
to: { $last: "$to" },
from: { $last: "$from" }
}
},
{ $project : {
_id : 0,
threadId : "$_id",
message: "$message",
to: "$to",
from: "$from"
}
},
function(err, threads) {
console.log(err);
console.log(threads);
}
);
它似乎工作得很好。让我知道是否有更简单的方法,或者是否可以优化此代码段。
希望这对其他人有所帮助。您不需要在这方面花费$project