Как переписать эту функцию для удаления только выбранных пользователей в Mon goose с Node.js - PullRequest
0 голосов
/ 09 января 2020

Эта функция удаляет всех пользователей внутри БД, кроме пользователей, чьи имена пользователей находятся внутри массива, однако я хочу реорганизовать его и позволить удалить только тех пользователей, чьи имена пользователей находятся внутри массива. Я использую Mon go DB mon goose с Node.js Express. Вот функция:

const usersToExclude = ["user1", "user2"];

mongoose
  .connect(dbConfig.url, {
    useNewUrlParser: true
  })
  .then(conn => getUsersExcept(usersToExclude))
  .then(users => deleteUsers(users))
  .then(result => {
    console.log(result);
  })
  .catch(err => {
    console.log(err);
  });

/**
 * Get a list of all users except the given users.
 * @param {string[]} usernames
 */
function getUsersExcept(usernames) {
  return User.find({ username: { $nin: usernames } });
}

/**
 * Delete all date realted to given user documents
 * @param {Document[]} users
 */
async function deleteUsers(users) {
  const ids = users.map(user => user._id);
  const chatListDeleteCout = await removeFromChatlist(ids);
  const conversationDeleteCount = await getConversations(ids).remove();
  const messageDeleteCount = await getMessages(ids).remove();
  const usersDeleteCount = await User.find({
    username: { $nin: usersToExclude }
  }).remove();
}

function removeFromChatlist(ids) {
  return User.updateMany(
    { "chatList.receiverId": { $in: ids } },
    {
      $pull: {
        chatList: {
          receiverId: { $in: ids }
        }
      }
    }
  );
}

/**
 * Get details of giver usernames
 * @param {string[]} usernames
 */
function getUserIds(usernames) {
  return User.find({ username: { $in: usernames } });
}

function getConversations(ids) {
  return Conversation.find({
    $or: [
      {
        "participants.receiverId": { $in: ids }
      },
      {
        "participants.senderId": { $in: ids }
      }
    ]
  });
}

function getMessages(ids) {
  return Message.find({
    $or: [
      {
        "message.senderId": { $in: ids }
      },
      {
        "message.receiverId": { $in: ids }
      }
    ]
  });
}

Таким образом, этот скрипт удалит всех пользователей внутри БД и оставит только пользователей user1 и user2. Как я могу заставить этот контроллер удалять только user1 и user2 и оставлять другие в БД?

1 Ответ

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

Вам просто нужно изменить одну строку кода для достижения этого

    username: { $in: usersToExclude } // $in instead of $nin to remove only matching documents

Это будет работать так же, как вы sh, однако это не самый оптимальный написанный запрос, и его можно оптимизировать, но это должно сделать работу за вас

...