2013-01-11 2 views
7

나는 username 알파벳순으로 정렬 모든 사용자를 얻을하려는 User 모델을몽구스 : 알파벳순으로 정렬

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

있습니다. 이것이 내가 시도한 것입니다.

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.