Mongoose聚集 - 有条件查找(用户1或用户2)



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

我认为此描述有点模棱两可,但我明白了您的观点,只有两种可能性。假设您要显示其他用户配置文件,则可以使用以下聚合:

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

最新更新