对于NoSQL和Mongoose来说,我是一个新手。我一直在寻找,但无法找到我正在寻找的东西(这让我更难以理解答案)。
基本上,我有一个由用户添加的记录列表。这些记录包含一些数据,我想有一个每个用户的最新插入消息的列表。
在SQL中我会写;
SELECT * FROM records ORDER BY inserted_date GROUP BY user_id;
这将返回一个像这样的集合;
[
{user: 2, insert_date: 2015-08-12T15:15:00, message: "Hi"},
{user: 3, insert_date: 2015-08-12T15:12:00, message: "Also hi"},
{user: 5, insert_date: 2015-08-12T15:14:00, message: "Not hi"}
]
我一直在环顾四周,找到了一些答案,但那些似乎没有用。
我已经尝试过了;
https://stackoverflow.com/a/7570091/1493455
还有其他一些像这样的东西;
Record.aggregate(
{},
{
$group: {
_id: '$user_id',
inserted: { $last: "$inserted" },
message: { $last: "$message" }
}
},
function(err, messages) {
console.log(err, messages);
}
);
我已经从另一个答案中复制了 - 但我真的不明白它的作用以及它应该做什么。
我当然可以为每个用户使用排序和限制查询,但这似乎非常低效。
如果有人能指出我正确的方向,我会感到高兴:)
答案 0 :(得分:0)
是的,重复:Mongoose - find last message from each user
我最终修复了我的代码;
Record.aggregate(
[
// Matching pipeline, similar to find
{
"$match": {}
},
// Sorting pipeline
{
"$sort": {
"inserted": -1
}
},
// Grouping pipeline
{
"$group": {
"_id": "$user_id",
"message": {
"$first": "$message"
},
"inserted": {
"$first": "$inserted"
}
}
},
// Project pipeline, similar to select
{
"$project": {
"_id": 0,
"user_id": "$_id",
"message": 1,
"inserted": 1
}
}
],
function(err, messages) {
console.log(err, messages);
}
);
并更新到最新的mongodb(3.4)而不是我正在运行的旧版本(2.x)(这会产生错误,因为尚未支持聚合)。