Подтвердить что ты не робот

Сортировка Mongo DB С регистром, нечувствительным

Я хотел бы получить отсортированную форму имен от mongodb.I сделал это через следующие

query.sort().on("name", Order.ASCENDING)

при выполнении этого запроса я смог найти отсортированные результаты с учетом регистра. Но я просто хочу получить результаты в случае игнорируемой формы. Как это сделать? Пожалуйста, провери меня через это.

Я работаю над Java-кодом. Поэтому, пожалуйста, предложите мне соответствующие методы.

4b9b3361

Ответ 1

Обновление: На данный момент mongodb имеет регистронезависимые индексы:

Users.find({})
  .collation({locale: "en" })
  .sort({name: 1})
  .exec()
  .then(...)

ракушка:

db.getCollection('users')
  .find({})
  .collation({'locale':'en'})
  .sort({'firstName':1})

Обновление: этот ответ устарел, 3.4 будет иметь регистронезависимые индексы. Обратитесь к JIRA для получения дополнительной информации https://jira.mongodb.org/browse/SERVER-90


К сожалению, MongoDB еще не имеет регистронезависимых индексов: https://jira.mongodb.org/browse/SERVER-90, и задача была отложена.

Это означает, что единственный способ сортировки без учета регистра в настоящее время состоит в том, чтобы фактически создать определенное поле "в нижнем регистре", скопировав значение (конечно же, в нижнем регистре) рассматриваемого поля сортировки и отсортировав его вместо этого.

Ответ 2

Сортировка работает так же, как в MongoDB, но вы можете сделать это "на лету" с помощью агрегата:

Возьмите следующие данные:

{ "field" : "BBB" }
{ "field" : "aaa" }
{ "field" : "AAA" }

Итак, со следующим утверждением:

db.collection.aggregate([
    { "$project": {
       "field": 1,
       "insensitive": { "$toLower": "$field" }
    }},
    { "$sort": { "insensitive": 1 } }
])

Результат:

{
    "field" : "aaa",
    "insensitive" : "aaa"
},
{
    "field" : "AAA",
    "insensitive" : "aaa"
},
{
    "field" : "BBB",
    "insensitive" : "bbb"
}

Фактический порядок вставки будет поддерживаться для любых значений, приводящих к тому же ключу при преобразовании.

Ответ 3

Это долгое время было проблемой на MongoDB JIRA, но теперь оно решается. Взгляните на эту заметку о выпуске для подробной документации. Вы должны использовать collation.

User.find()
    .collation({locale: "en" }) //or whatever collation you want
    .sort({name:'asc'})
    .exec(function(err, users) {
        // use your case insensitive sorted results
    });

Ответ 4

Здесь он находится на Java. Я смешал варианты no-args и first key-val BasicDBObject только для разнообразия

        DBCollection coll = db.getCollection("foo");

        List<DBObject> pipe = new ArrayList<DBObject>();

        DBObject prjflds = new BasicDBObject();
        prjflds.put("field", 1);
        prjflds.put("insensitive", new BasicDBObject("$toLower", "$field"));

        DBObject project = new BasicDBObject();
        project.put("$project", prjflds);
        pipe.add(project);

        DBObject sort = new BasicDBObject();
        sort.put("$sort", new BasicDBObject("insensitive", 1));
        pipe.add(sort);

        AggregationOutput agg = coll.aggregate(pipe);

        for (DBObject result : agg.results()) {
            System.out.println(result);
        }

Ответ 5

Если вы используете Mongoose, вот еще один вариант

var schema = new Schema({
    name: String
}, { collation: { locale: 'en_US', caseLevel: true } });

https://mongoosejs.com/docs/guide.html#collation

Ответ 6

На данный момент (mongodb 4) вы можете сделать следующее:

оболочка монго:

db.getCollection('users')
  .find({})
  .collation({'locale':'en'})
  .sort({'firstName':1});

мангуста:

Users.find({})
  .collation({locale: "en" })
  .sort({name: 1})
  .exec()
  .then(...)

Здесь поддерживаются языки и локали mongodb.

Ответ 7

Мы решаем эту проблему с помощью .sort-функции в массиве JavaScript

Вот код

    function foo() {
      let results = collections.find({
        _id: _id
      }, {
        fields: {
          'username': 1,
        }
      }).fetch();

      results.sort((a, b)=>{
        var nameA = a.username.toUpperCase();
        var nameB = b.username.toUpperCase();

        if (nameA  nameB) {
          return 1;
        }
        return 0;
      });

      return results;
    }