我正在编写DB聚合功能,以从Messages
表中获取用户的ChatHeads
。
以下是Messages
表的消息对象
{
"_id": "5c6e54c194509100146ea6da",
"chat_id": "5bc81391767ba50013bc251c5bc58ac0ff45070013383422",
"user1": "5bc58ac0ff45070013383422",
"user2": "5bc81391767ba50013bc251c",
"messageFrom": "5bc58ac0ff45070013383422",
"dateTime": "2019-02-21T07:35:29.653Z",
"message": "Hello ",
}
根据提出请求的用户,聊天头应填充另一个用户的ID,以在聊天头中显示他的名字/图片。
我正在使用汇总来获取聊天率,但是另一个用户的有条件人口是我遇到的麻烦。以下是我当前查询,其中 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
我认为此描述有点模棱两可,但我明白了您的观点,只有两种可能性。假设您要显示其他用户配置文件,则可以使用以下聚合:
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" } }
])
从本质上讲,在运行$查找之前,您可以使用$ cond的$ addfields来定义应使用哪个用户ID进行查找。