简体   繁体   中英

How can I properly sort this request to mongodb?

I want to display user scores ordered by scores:

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

I start off with this in my server.js file:

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...

The only way of sorting, that does not break everything and seemed easy to implement, looks like this:

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

However, it does not order them how you would want it. It seems to me that it orders by the first digit and then second digit, not the value of the integer:

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...

Any ideas?

Thank you.

Save score as number , not as string so sorting will be by number and not by characters.

Make sure score is being saved as number , number values don have quotes {"number" : 5, "string": "string value"} .

db.scores.find() // check our data

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

db.scores.find().sort({score: -1}) //sort score descending

{ "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}) //sort type descending

{ "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)

Try with:

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

and make sure this object generates:

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

The http body had to be converted from a string to an integer, when saved to the database, in order to be sorted by integer value.

reg.body.score.toInt() did not work (error: not a function), although I've seen it in some places elswhere. Using parseInt solved it for me:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM