2013-01-11 15 views
7

Mam User modelowiMongoose: Sortuj alfabetycznie

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

chcę uzyskać wszystkich użytkowników, posortowane alfabetycznie według username. To właśnie wypróbowałem:

Jednak to nie sortuje użytkowników alfabetycznie. Jak mogę posortować alfabetycznie?

EDIT: mam mylić, ponieważ spodziewałem się "czysto" sortowanie alfabetycznie od Mongoose, a nie jeden, gdzie Z>a. Zasadniczo chciałem sortować na podstawie username.toLowerCase().

+3

To prawo składni, tak że powinno działać. – JohnnyHK

+0

Sortuje użytkowników według daty wstawienia. I z "-1" odwrotnie do wstawienia daty. – Randomblue

+0

Czy możesz zamieścić minimalny przykład, który powiela problem (wraz z danymi)? – JohnnyHK

Odpowiedz

10

EDYCJA: Na komentarz okazuje się, że problem jest sortowania na toLowerCase(username). MongoDB nie ma wbudowanej metody złożonego sortowania. Istnieją zatem dwa sposoby:

  1. Dodaj do schematu pole. Jest to lepsza opcja, jeśli musisz to zrobić bardzo często.
  2. Perform an aggregation z rzutowaniem przy użyciu $toLower operator do dynamicznego generowania pola usernameLowerCase. Jest to spowodowane ograniczeniami wydajności i pamięci, ale może to być wygodniejszy wybór.

Oryginalna odpowiedź: Oto pełny przykład, który jest sortowany poprawnie, przy użyciu określonego kodu z pytania. Więc to musi być coś innego dzieje:

#! /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); 
     }); 
    } 
); 
+0

To bardzo zaskakujące, że Mongoose nie oferuje kompleksowego sortowania. – Randomblue

5

to pytanie i odpowiedź na kilka lat, i od tego, co mogę powiedzieć jest teraz poprawny sposób to zrobić. Zapewnienie to dla przyszłych wyszukiwań:

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

Można też indeks username bez czułości Obudowa:

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

strength:1 ma innej opcji - najlepiej odnieść się do dokumentacji, która ma zdecydować, który działa najlepiej dla Ciebie.

Szczegółowe informacje o tym wszystkim, look here.

Powiązane problemy