猫鼬聚合-有条件地查找(用户1或用户2)

时间:2019-02-25 20:11:58

标签: node.js mongodb aggregation-framework

我正在编写一个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.user1entry.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

1 个答案:

答案 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进行查找。