Как использовать условие массива NOT IN внутри агрегата поиска mongodb $ - PullRequest
1 голос
/ 02 августа 2020

У меня есть две коллекции:

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'
    }
  }
]

, но это не заполняет нужный мне результат.

Может ли кто-нибудь мне помочь с этим?

Спасибо

1 Ответ

1 голос
/ 02 августа 2020

Вы должны использовать $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

...