Сортировка Mongo DB С регистром, нечувствительным
Я хотел бы получить отсортированную форму имен от mongodb.I сделал это через следующие
query.sort().on("name", Order.ASCENDING)
при выполнении этого запроса я смог найти отсортированные результаты с учетом регистра. Но я просто хочу получить результаты в случае игнорируемой формы. Как это сделать? Пожалуйста, провери меня через это.
Я работаю над Java-кодом. Поэтому, пожалуйста, предложите мне соответствующие методы.
Ответы
Ответ 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;
}