猫鼬:按字母顺序排序

时间:2013-01-11 14:13:19

标签: node.js mongodb mongoose

我有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()的排序。

2 个答案:

答案 0 :(得分:14)

编辑:根据评论,该问题最终在toLowerCase(username)上排序。 MongoDB没有用于复杂排序的内置方法。所以基本上有两种方法:

  1. 向架构添加usernameLowerCase字段。如果您需要这么做,这是更好的选择。
  2. Perform an aggregation使用$toLower operator投影动态生成usernameLowerCase字段。这包括性能和内存注意事项,但它可能是更方便的选择。
  3. 原始答案:这是一个完整的示例,使用问题中的特定代码正确排序。所以必须有其他事情发生:

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