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