MongoDB находит возврат документов в половине случаев - PullRequest
1 голос
/ 30 июня 2019

Я использую MongoDB с Express, и у меня есть выборка, чтобы получить список пользователей и отсортировать их по количеству достигнутых побед. Проблема в том, что 80% времени один и тот же код возвращает отсортированный список без проблем, но в 20% случаев ответ представляет собой пустой массив [].

У меня везде есть обещания, и я перепроверил, что проблема в методе find mongoDB, а не в методе sort. Я знаю о параллелизме и прочем, я просто не понимаю, почему это не работает.

app.get("/api/account/getSortedRank", (req, res) => {

    const { query } = req;
    const { userId } = query;

    var getFriends = [];

    User.findOne(
      {
        _id: userId
      },
      (err, user) => {
        if (err) {
          console.log("Server error");
        }
        user.friends.forEach(userFound => {
          getFriends.push(userFound.user);
        });

        // getFriends is always correct!

      }
    ).then(() => {
      User.find({
        _id: { $in: getFriends }
      })
        .sort({ wins: -1 })
        .then(sortedUsers => {

          // 50% of the time sortedUsers is an empty array!
          let usersList = [];
          sortedUsers.forEach(user => {
            usersList.push({
              firstName: user.firstName,
              lastName: user.lastName,
              userID: user._id,
              wins: user.wins
            });
          });
          return res.send({
            success: true,
            usersList
          });
        });
    });
  });


1 Ответ

0 голосов
/ 30 июня 2019

Здесь вы смешиваете обратные вызовы и обещания, что, вероятно, в конечном итоге приведет к выполнению запроса findOne дважды, с разным временем завершения.Так что getFriends иногда заполняется во времени, но иногда это не так.

Вместо этого переместите запрос find в обратный вызов findOne:

User.findOne(
  {
    _id: userId
  },
  (err, user) => {
    if (err) {
      console.log("Server error");
    }
    var getFriends = [];
    user.friends.forEach(userFound => {
      getFriends.push(userFound.user);
    });

    // getFriends is always correct!
    User.find({
      _id: { $in: getFriends }
    })
      .sort({ wins: -1 })
      .then(sortedUsers => {

        let usersList = [];
        sortedUsers.forEach(user => {
          usersList.push({
            firstName: user.firstName,
            lastName: user.lastName,
            userID: user._id,
            wins: user.wins
          });
        });
        return res.send({
          success: true,
          usersList
        });
      });
  }
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...