我有以下查询,它应该提取从所有用户发送到单个用户的最新消息:
await Conversation.aggregate(
[
// Matching pipeline, similar to find
{
$match: {
recipient: mongoose.Types.ObjectId(id)
}
},
// Sorting pipeline
{
$sort: {
date: -1
}
},
// Grouping pipeline
{
$group: {
_id: "$_id",
sender: {
$first: "$sender"
},
text: {
$first: "$text"
},
date: {
$first: "$date"
},
unread: {
$first: "$unread"
}
}
},
{
$lookup: {
from: "users",
localField: "sender",
foreignField: "_id",
as: "sender"
}
},
{ $unwind: { path: "$sender" } },
// Project pipeline, similar to select
{
$project: {
sender: 1,
_id: 1,
text: 1,
date: 1,
unread: 1
}
}
],
function(err, messages) {
if (err) {
console.log("err with agg query", err);
} else {
console.log("latestMessages", messages);
}
}
);
问题是它返回多个记录。它返回:
[
{
_id: 5d9b51eed6606f12f5434d46,
sender: {
_id: 5d9b5142d6606f12f5434d41,
email: null,
numberOfPosts: 0,
date: 2019-10-07T14:52:50.467Z,
__v: 0
},
text: 'Ayyy',
date: 2019-10-07T14:55:42.141Z,
unread: false
},
{
_id: 5d9b5178d6606f12f5434d43,
sender: {
_id: 5d9b5142d6606f12f5434d41,
email: null,
numberOfPosts: 0,
date: 2019-10-07T14:52:50.467Z,
__v: 0
},
text: 'hey!',
date: 2019-10-07T14:53:44.073Z,
unread: false
}
]
当应该仅返回sender为5d9b5142d6606f12f5434d41
的第一个元素时,即第一个最新对象。
我在这里做什么错了?
答案 0 :(得分:1)
更改qroup管道就像
您需要按发件人分组,而不要使用唯一的_id
$project: {
sender: 1,
_id: "$messageId",
text: 1,
date: 1,
unread: 1
}
然后更改$ project
{{1}}