我正在编写一个数据库聚合函数,以便从 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"
}
我的要求
如果entry.user1==req.user._id
,localField
应该显示 entry.user1
如果 entry.user2==req.user._id
localField
应该显示 entry.user2
最佳答案
我认为这个描述有点含糊,但我明白你的观点,并且只有两种可能性。假设您想显示其他用户的个人资料,您可以使用以下聚合:
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 进行查找。
关于node.js - Mongoose 聚合 - 有条件查找(user1 或 user2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54873913/