mongoDB $ в проверке, если массив пуст? - PullRequest
0 голосов
/ 15 января 2020

Эта функция работает как задумано.

static getUsersWithTasks = (ids) => {
  const db = getDb();
  return db
    .collection(process.env.USERSCOLLECTION)
    .aggregate([
      { $match: { _id: { $in: ids } } },
      {
        $project: {
          password: 0,
          tokens: 0,
          spaces: 0,
          incomingSpaceInvites: 0,
          incomingFriendRequest: 0,
          friends: 0
        }
      },
      {
        $lookup: {
          from: "challenges",
          let: { tasks: "$tasks" },
          pipeline: [
            {
              $match: {
                $expr: { $in: ["$_id", "$$tasks"] }
              }
            }
          ],
          as: "populatedTasks"
        }
      }
    ])
    .toArray();
};

Однако у некоторых пользователей есть только пустой массив tasks, поскольку им еще предстоит создать задачу.

Если у пользователя поэтому есть пустой массив tasks, то Я получаю ошибку mongodb, потому что $ in требует массив в качестве второго аргумента.

Если у всех пользователей есть значение в массиве tasks, то все работает нормально.

Мой вопрос:

Есть ли способ пропустить фазу поиска, если этот пользователь tasks массив пуст?

Спасибо за ваше время!

1 Ответ

0 голосов
/ 15 января 2020

У вас есть два варианта:

  1. Используйте $ facet , чтобы разбить вашу агрегацию на 2 (один для пользователей с задачами и один для пользователей без), однако это создает «грязный» конвейер, и я не уверен, что он будет более эффективным, чем использование варианта 2 (если вы попробуете, дайте мне знать).

  2. Создать tasks как пустой массив для пользователей без него, это не «пропустит» пользователей с пустым массивом tasks, поэтому производительность будет затронута, но агрегация не будет выполнена, для этого добавьте этот этап $project перед этапом $lookup:

{
    $project:{
        tasks: {$ifNull: ["$tasks", []]}
    }
}
...