Как правильно отсортировать этот запрос к mongodb? - PullRequest
0 голосов
/ 27 февраля 2020

Я хочу отображать оценки пользователей, упорядоченные по счетам:

  const gotHighscore = {
    score: req.body.score,
    name: req.body.name,
    created: new Date() 
  };

Я начинаю с этого на моем сервере. js Файл:

app.get("/getHighscore", (req, res) => {
  gotHighscore
      .find()
      .then(gotHighscore => {
        res.json(gotHighscore);
      });
});

Chrome log:

0: {_id: "5e57afae67db842ff4bf806b", score: "150", name: "Hendel", created: "2020-02-27T12:01:50.173Z"}
1: {_id: "5e57b4fb67db842ff4bf806c", score: "70", name: "123", created: "2020-02-27T12:24:27.351Z"}
2: {_id: "5e57b63667db842ff4bf806d", score: "110", name: "iseemypee", created: "2020-02-27T12:29:42...

Единственный способ сортировки, который не разбивает все и кажется простым в реализации, выглядит следующим образом:

app.get("/getHighscore", (req, res) => {
  gotHigscore
      .find({}, {sort : {score: -1}})
      .then(gotHighscore => {
        res.json(gotHighscore);
      });
});

Однако он не упорядочивает их так, как вы бы хотели Это. Мне кажется, что он упорядочивает по первому di git, а затем по второму di git, а не по целому числу:

0: {_id: "5e57b4fb67db842ff4bf806c", score: "70", name: "123", created: "2020-02-27T12:24:27.351Z"}
1: {_id: "5e57afae67db842ff4bf806b", score: "150", name: "Hendryk", created: "2020-02-27T12:01:50.173Z"}
2: {_id: "5e57b63667db842ff4bf806d", score: "110", name: "iseemypee", created: "2020-02-27T12:29:42.25...

Есть идеи?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 28 февраля 2020

Тело http нужно было преобразовать из строки в целое число при сохранении в базе данных, чтобы отсортировать по целому значению.

reg.body.score.toInt() не работало (ошибка: не функция ), хотя я видел это в некоторых местах. Использование parseInt решило это для меня:

  const mew = {
    score: parseInt(req.body.score),
    name: req.body.name,
    created: new Date() 
  };
0 голосов
/ 27 февраля 2020

Сохранить score как number, а не как string, поэтому сортировка будет выполняться по номеру, а не по символам.

Убедитесь, что score сохраняется как number, числовые значения иметь кавычки {"number" : 5, "string": "string value"}.

db.scores.find () // проверить наши данные

{ "score" : 1, "type" : "Hendryck" }
{ "score" : 2, "type" : "iseempyee" }
{ "score" : 3, "type" : "123" }
{ "score" : 4, "type" : "0720" }

db.scores.find (). sort ({score: -1}) // сортировка по убыванию

{ "score" : 4, "type" : "0720" } // number 4 is the highest
{ "score" : 3, "type" : "123" }
{ "score" : 2, "type" : "iseempyee" }
{ "score" : 1, "type" : "Hendryck" } //number 1 is the lowest

db.scores.find (). sort ({type: -1}) // тип сортировки по убыванию

{ "score" : 2, "type" : "iseempyee" }
{ "score" : 1, "type" : "Hendryck" }
{ "score" : 3, "type" : "123" } // '113' > '0720' with string values
{ "score" : 4, "type" : "0720" } // reason -> '1' > '0' (ascii values)

Попробуйте:

const gotHighscore = {
    score: parseInt(req.body.score, 10), //parseInt(value, base)
    name: req.body.name,
    created: new Date() 
  };

и убедитесь, что этот объект генерирует:

{ 
  score: 0,  // number
  name: "name", // string
  created: "date"  
}
...