Условно исключая поле, не работающее в MongoDB - PullRequest
0 голосов
/ 29 сентября 2018

Я хотел бы получить пользователя из базы данных.Моя функция принимает requesterId, который является идентификатором пользователя, запрашивающего эти данные, и targetId, который является пользователем для извлечения.

Если запрашивающий объект находится в массиве friends цели (строки), поле phone должно быть включено в проекцию.Если нет, то это исключено.

Я прочитал следующий запрос после прочтения примера здесь .Однако поле phone всегда возвращается независимо от того, что.Что я делаю не так?

  getUser: function getUser(requesterId, targetId) {
    return db.collection('users').aggregate([
      {$match: {userId: targetId}},
      {
        $project:
          {
            firstName: 1,
            phone: {
              $cond: {
                if: {friends: requesterId},
                then: "$phone",
                else: "$$REMOVE"
              }
            }
          }
      },
      {$limit: 1}
    ]).toArray();
  }

Схема (создана в Компасе без кода):
userId - Строка
firstName - Строка
friends - Array (String)
phone - String

Индексы : Нет в этой коллекции

Пример:

/* Bob's MongoDB data */ {userId: "BobID", firstName: "Bob", friends: ["AmyID"], phone: "1234567890"}
getUser(requesterId = 'AmyID', targetId = 'BobID');
/* Result */ {firstName: "Bob", phone: "1234567890"}

/* Amy's MongoDB data */ {userId: "AmyID", firstName: "Amy", friends: ["CassieID"], phone: "9876543210"}
getUser(requesterId = 'BobID', targetId = 'AmyID');
/* Result */ {firstName: "Amy", phone: "987654321"}

Запрос Боба на пользователя Эми не должен возвращать ее номер телефона, поскольку он отсутствует в ее массиве friends.

1 Ответ

0 голосов
/ 29 сентября 2018

Значение if: должно быть логическим выражением, а не объектом запроса.Чтобы проверить, находится ли указанное значение в массиве, вы можете использовать выражение $in:

db.collection('users').aggregate([
  {$match: {userId: targetId}},
  {
    $project:
      {
        firstName: 1,
        phone: {
          $cond: {
            if: {$in: [requesterId, '$friends']},
            then: "$phone",
            else: "$$REMOVE"
          }
        }
      }
  },
  {$limit: 1}
])
...