20

私は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);
});

ただし、これはユーザーをアルファベット順にソートしません。アルファベット順に並べ替えるにはどうすればよいですか?

EDITZ : Mongooseからの「純粋にアルファベット順」のソートを期待していたので、混乱しましたa。基本的に、に基づいてソートしたかったのusername.toLowerCase()です。

4

2 に答える 2

27

この質問と回答は数年前のものであり、私が言えることから、これを行う正しい方法が今あります。これを将来の検索者に提供する:

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は別のオプションです。ドキュメントを参照して、どちらが最適かを判断することをお勧めします。

これらすべての詳細については、こちらをご覧ください。

于 2017-06-26T21:09:39.793 に答える
24

編集:コメントによると、問題はでソートされていることが判明しましたtoLowerCase(username)。MongoDBには、複雑な並べ替えのための組み込みメソッドがありません。したがって、基本的に2つの方法があります。

  1. usernameLowerCaseスキーマにフィールドを追加します。これを頻繁に行う必要がある場合は、これがより適切なオプションです。
  2. $toLower演算子を使用して射影を使用して集計を実行し、フィールドを動的に生成し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);
        });
    }
);
于 2013-01-14T16:43:37.920 に答える