如何在MongoDB $lookup聚合中使用NOT IN数组条件

3

我有两个集合:

Users:
{
    _id: ObjectId('5e11d2d8ad9c4b6e05e55b82'),
    name:"vijay"
}

Followers :
{
    _id:ObjectId('5ed0c8faac47af698ab9f659'),
    user_id:ObjectId('5e11d2d8ad9c4b6e05e55b82'),
    following:[
        ObjectId(5ee5ca5fac47af698ab9f666'),
        ObjectId('5df7c0a66243414ad2663088')
    ]
    created_at:"2020-05-29T08:34:02.959+00:00"
}

我需要列出特定用户表中不在以下数组中的所有用户,通过在关注者表中编写聚合函数,我得出了以下结果。
[
  {
    '$match': {
      'user_id': new ObjectId('5e11d2d8ad9c4b6e05e55b82')
    }
  }, {
    '$project': {
      'user_id': '$user_id', 
      'following': '$following'
    }
  }, {
    '$lookup': {
      'from': 'users', 
      'pipeline': [
        {
          '$match': {
            '_id': {
              '$nin': [
                '$following'
              ]
            }
          }
        }
      ], 
      'as': 'result'
    }
  }
]

但是这并没有填充我所需要的输出。
有人能帮我吗?
谢谢。

需要什么输出? - Gibbs
1个回答

3

在编程中,您应该使用$not$in来与$expr表达式一起使用,因为$nin是一个查询操作符,不适用于聚合表达式。

  • 还有一个修复方法就是需要创建变量,使用let: { following: "$following"}并在管道内部使用$$following,因为查找管道不允许在没有引用的情况下访问字段。
  {
    $lookup: {
      from: "Users",
      let: {
        following: "$following"
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $not: {
                $in: [
                  "$_id",
                  "$$following"
                ]
              }
            }
          }
        }
      ],
      as: "result"
    }
  }

工作场所:https://mongoplayground.net/p/08OT6NnuYHx


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接