Используйте MongoDB $lookup для поиска документов в другой коллекции, отсутствующей в массиве

#javascript #node.js #mongodb #aggregation-framework #lookup

Вопрос:

Я использую платформу aggregate для запроса коллекции и создания массива активных игроков (до последнего $lookup ), после чего я пытаюсь использовать $lookup и $pipeline выбрать всех игроков из другой коллекции ( users ), которых нет внутри activeUsers массива.

Есть ли какой-нибудь способ сделать это с моей текущей настройкой?

 Game.aggregate[{
  $match: {
    date: {
      $gte: ISODate('2021-04-10T00:00:00.355Z')
    },
    gameStatus: 'played'
  }
}, {
  $unwind: {
    path: '$players',
    preserveNullAndEmptyArrays: false
  }
}, {
  $group: {
    _id: '$players'
  }
}, {
  $group: {
    _id: null,
    activeUsers: {
      $push: '$_id'
    }
  }
}, {
  $project: {
    activeUsers: true,
    _id: false
  }
}, {
  $lookup: {
    from: 'users',
    'let': {
      active: '$activeUsers'
    },
    pipeline: [{
        $match: {
          deactivated: false,
          // The rest of the query works fine but here I would like to 
          // select only the elements that *aren't* inside
          // the array (instead of the ones that *are* inside)
          // but if I use '$nin' here mongoDB throws 
          // an 'unrecognized' error 
          $expr: {
            $in: [
              '$_id',
              '$active'
            ]
          }
        }
      },
      {
        $project: {
          _id: 1
        }
      }
    ],
    as: 'users'
  }
}] 

Спасибо

Комментарии:

1. просто используйте $not вот так { $expr: { $not: { $in: ['$_id', '$$active'] } } }

2. Пожалуйста, добавьте свой комментарий в качестве ответа, чтобы я мог выбрать его в качестве принятого ответа.

Ответ №1:

Для отрицательного состояния используйте $not перед $in оператором,

 { $expr: { $not: { $in: ['$_id', '$active'] } } }