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

但是,这不会按字母顺序对用户进行排序。如何按字母顺序排序?

编辑:我很困惑,因为我期待 Mongoose 的“纯粹按字母顺序”排序,而不是Z>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 没有用于复杂排序的内置方法。所以基本上有两种方法:

  1. usernameLowerCase向 Schema添加一个字段。如果您需要经常这样做,这是更好的选择。
  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 回答