2013-01-11 65 views
7

我有一個User模型貓鼬:按字母順序排序

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

我想所有的用戶,通過username字母順序排序。這是我試過的

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

但是,這不會按字母順序對用戶進行排序。我怎樣才能按字母順序排序?

編輯:我糊塗了,因爲我期待從貓鼬是「純粹的字母順序」排序,而不是一個地方Z>a。基本上,我想要基於username.toLowerCase()進行排序。

+3

這纔是正確的語法,所以應該工作。 – JohnnyHK

+0

它根據插入日期對用戶進行排序。與'-1'反向插入日期。 – Randomblue

+0

你可以發佈一個重複出現問題的簡單例子(包含數據)嗎? – JohnnyHK

回答

10

編輯:根據評論該問題原來是排序toLowerCase(username)。 MongoDB沒有內置的複雜排序方法。所以基本上有兩種方法:

  1. usernameLowerCase字段添加到架構。如果你需要這麼做,這是更好的選擇。
  2. Perform an aggregation帶投影使用$toLower operator動態生成一個usernameLowerCase字段。這帶有性能和內存告誡,但它可能是更方便的選擇。

原始答案:下面是一個完整的示例,它使用問題中的特定代碼正確排序。所以一定有別的事情上:

#! /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

Mongoose不提供複雜的排序是非常令人驚訝的。 – Randomblue

5

這個問題的答案有幾個歲,從我可以告訴現在有這樣做的正確道路。提供這種對未來搜索:

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

你也可以指數username不區分大小寫:

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

strength:1是另一種選擇 - 最好參考文檔以決定哪個最適合你。

對於這一切的細節,look here.