【发布时间】:2019-10-08 20:37:31
【问题描述】:
我有以下查询,它应该提取从所有用户发送给单个用户的最新消息:
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
}
]
当它应该只返回发送者为5d9b5142d6606f12f5434d41 的第一个元素时,即第一个最新的对象。
我在这里做错了什么?
【问题讨论】:
-
您在 $_id 上进行分组,作为响应,您看起来有单独的唯一 _id,这就是为什么它们没有分组在一起,因为 $group 将根据 _id 中给出的字段进行分组。跨度>