node.js - Mongoose 聚合 - 有条件查找(user1 或 user2)

标签 node.js mongodb aggregation-framework

我正在编写一个数据库聚合函数,以便从 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"
            }

我的要求

如果 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/

相关文章:

javascript - 如何在 Node 中使用全局 URLSearchParams

MongoDB 3.0 在副本模式下对 oplog 集合的写锁定

ruby-on-rails - rails : Use development db for testing

mongodb - 将多个值分组到聚合中

javascript - 测试进程在开 Jest 中并行运行时终止 - "A worker process has quit unexpectedly!"

node.js - 由于 node-gyp 重建错误,无法安装 node-xmpp 或 node-expat

Node.js - Express - 类型错误 : res. json 不是函数

python - pymongo 没有关闭连接

java - 如何使用 Java 从 MongoDB 读取嵌套数组

MongoDB 聚合 $or 与 $elemMatch、$expr 在 $lookup 管道内