我正在编写一个DB Aggregate函数,以从ChatHeads
表中为用户获取Messages
。
以下是Messages
表中的消息对象
{
"_id": "5c6e54c194509100146ea6da",
"chat_id": "5bc81391767ba50013bc251c5bc58ac0ff45070013383422",
"user1": "5bc58ac0ff45070013383422",
"user2": "5bc81391767ba50013bc251c",
"messageFrom": "5bc58ac0ff45070013383422",
"dateTime": "2019-02-21T07:35:29.653Z",
"message": "Hello ",
}
根据发出请求的用户,聊天头应该填充另一个用户的ID,以便在聊天头中显示他的姓名/照片。
我正在使用Aggregate获取聊天头,但是遇到麻烦的是其他用户的有条件填充。下面是我当前的查询,其中req.user._id
是发出请求的用户的ID。
chat.aggregate(
{
$match: {
$or: [ { user1:req.user._id }, { user2:req.user._id } ]
}
},
{
$group:{
_id: '$chat_id',
entry: { $first: "$$ROOT" },
}
}
根据我的理解,$lookup
带条件可能会帮助localField
根据其值更改为entry.user1
或entry.user2
的地方。
以下是汇总部分
$lookup: {
from: "users",
localField: < "entry.user1" or "entry.user2" depending upon condition> ,
foreignField: "_id",
as: "other_user"
}
我的要求
localField
应该说entry.user1
,如果entry.user1==req.user._id
localField
应该说entry.user2
,如果entry.user2==req.user._id
答案 0 :(得分:1)
我认为这个描述有点含糊,但我明白你的意思,只有两种可能。假设您要显示其他用户的个人资料,可以使用以下汇总:
db.messages.aggregate([
{ $match: { $or: [ { user1:req.user._id }, { user2:req.user._id } ] } },
{ $addFields: { otherUser: { $cond: [ { $eq: [ "$user1", req.user._id ] }, "$user2", "user1" ] } } },
{ $lookup: { from: "users", localField: "otherUser", foreignField: "_id", as: "otherUserDetails" } }
])
基本上,在运行$lookup之前,可以将$addFields与$cond一起使用,以定义应使用哪个用户的ID进行查找。