我有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()
的排序。
答案 0 :(得分:14)
编辑:根据评论,该问题最终在toLowerCase(username)
上排序。 MongoDB没有用于复杂排序的内置方法。所以基本上有两种方法:
usernameLowerCase
字段。如果您需要这么做,这是更好的选择。$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);
});
}
);
答案 1 :(得分:12)
这个问题和答案已经有几年了,而且据我所知,现在有一个正确的方法可以做到这一点。为未来的搜索者提供此服务:
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.