#java #mongodb #sorting #aggregation-framework #spring-data-mongodb
#java #mongodb #сортировка #агрегация-фреймворк #spring-data-mongodb
Вопрос:
Допустим, у меня есть следующий объект JSON
[
{
"id":"1",
"fruitName":{
"name":"Apple",
"color":"Red"
}
},
{
"id":"2",
"fruitName":{
"name":"Mango",
"color":"Yellow"
}
},
{
"id":"3",
"vegetableName":{
"name":"Cabbage",
"color":"Green"
}
}
]
Я хочу отсортировать их по имени в алфавитном порядке, которые расположены внутри двух разных полей (fruitName и vegetableName).
Есть ли какой-либо способ сделать это в Spring Mongo без изменения объекта JSON, чтобы результат был таким.
[
{
"id":"1",
"fruitName":{
"name":"Apple",
"color":"Red"
}
},
{
"id":"3",
"vegetableName":{
"name":"Cabbage",
"color":"Green"
}
},
{
"id":"2",
"fruitName":{
"name":"Mango",
"color":"Yellow"
}
}
]
Ответ №1:
Да, вы можете сделать это без изменения объекта JSON, используя проекцию с условием.
db.collection.aggregate([{
$project: {
id: 1,
fruitName: 1,
vegetableName: 1,
name: { $ifNull: ['$fruitName.name', '$vegetableName.name'] },
}
}, {
$sort: {
name: 1
}
}])
Если вы используете mongodb версии 3.4 , вы также можете использовать addFields.
db.collection.aggregate([{
$addFields: {
name: { $ifNull: ['$fruitName.name', '$vegetableName.name'] }
}
}, {
$sort: {
name: 1
}
}])
Комментарии:
1. У меня проблема с этим. Если я пропущу и ограничу результат сортировки, возвращаемые данные больше не будут правильными. { «$skip»:{ «$NumberLong»:»0″ } }, { «$ лимит»:{ «$NumberLong»:»20″ } }
2. Можете ли вы опубликовать пример того, какие результаты вы ожидаете и какие результаты вы получаете вместе с запросом? Будет лучше, если вы добавите для этого отдельный вопрос.
3. Извините, у меня была ошибка при переводе в spring code. Я использовал . затем для vegetableName.name таким образом, значение имени всегда равно «vegetableName.name «. Это должно быть .thenValueOf, чтобы значение было фактическим значением объекта. Это не имеет ничего общего с сортировкой все время.