Как сортировать между двумя отдельными вложенными объектами в spring mongo

#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, чтобы значение было фактическим значением объекта. Это не имеет ничего общего с сортировкой все время.