Mangusta: ordina in ordine alfabetico

Ho un modello User

 var User = mongoose.model('Users', mongoose.Schema({ username: 'string', password: 'string', rights: 'string' }) ); 

Voglio ottenere tutti gli utenti, ordinati alfabeticamente per username . Questo è quello che ho provato

 User.find({}, null, {sort: {username: 1}}, function (err, users) { res.send(users); }); 

Tuttavia, questo non ordina gli utenti in ordine alfabetico. Come posso ordinare alfabeticamente?

EDIT : mi sono confuso perché mi aspettavo un tipo “puramente alfabetico” da Mongoose, non uno dove Z > a . Fondamentalmente, volevo un ordinamento basato su username.toLowerCase() .

EDIT: Per il commento il problema risulta essere l’ordinamento su toLowerCase(username) . MongoDB non ha un metodo integrato per l’ordinamento complesso. Quindi ci sono essenzialmente due modi per andare:

  1. Aggiungi un campo usernameLowerCase allo schema. Questa è l’opzione migliore se hai bisogno di farlo molto.
  2. Eseguire un’aggregazione con una proiezione utilizzando l’ operatore $toLower per generare dynamicmente un campo usernameLowerCase . Ciò si accompagna alle avvertenze sulle prestazioni e sulla memoria, ma potrebbe essere la scelta più conveniente.

Risposta originale: ecco un esempio completo che ordina correttamente utilizzando il codice specifico della domanda. Quindi deve esserci qualcos’altro che sta succedendo:

 #! /usr/bin/node var mongoose = require('mongoose'); mongoose.connect('localhost', 'test'); var async = require('async'); var User = mongoose.model('Users', mongoose.Schema({ username: 'string', password: 'string', rights: 'string' }) ); var userList = [ new User({username: 'groucho', password: 'havacigar', rights: 'left'}), new User({username: 'harpo', password: 'beepbeep', rights: 'silent'}), new User({username: 'chico', password: 'aintnosanityclause', rights: 'all'}) ]; async.forEach(userList, function (user, SaveUserDone) { user.save(SaveUserDone); }, function (saveErr) { if (saveErr) { console.log(saveErr); process.exit(1); } User.find({}, null, {sort: {username: 1}}, function (err, users) { if (err) { console.log(err); process.exit(1); } console.log(users); process.exit(0); }); } ); 

Questa domanda e risposta hanno alcuni anni e da quello che posso dire ora c’è un modo corretto per farlo. Fornire questo per i futuri utenti:

 User.find().collation({locale:'en',strength: 2}).sort({username:1}) .then( (users) =>{ //do your stuff }); 

Puoi anche indicizzare il username senza distinzione tra maiuscole e minuscole:

 UserSchema.index({username:1}, {collation: { locale: 'en', strength: 2}}); 

strength:1 è un’altra opzione – meglio fare riferimento alla documentazione per decidere quale funziona meglio per te.

Per i dettagli di tutto questo, guarda qui.