Как отсортировать коллекцию на основе элемента массива

#mongodb #mongoose #mongodb-query #aggregation-framework #spring-data-mongodb

Вопрос:

Мне нужно отсортировать документ по цене, а цена — это массив, пока мы сортируем цену на основе ключа PRICE_A, PRICE_B или PRICE_C. пример данных:

 [
  {
    "_id": 1,
    "price": [
      {
        "PRICE_A": 3098.67
      },
      {
        "PRICE_B": 3166.67
      },
      {
        "PRICE_C": 3800
      }
    ]
  },
  {
    "_id": 2,
    "price": [
      {
        "PRICE_A": 679.6
      },
      {
        "PRICE_B": 781.6
      },
      {
        "PRICE_C": 938
      }
    ]
  }
]
 

ожидаемый результат: в порядке возрастания_a

 [
   {
      "_id":2,
      "price":[
         {
            "PRICE_A":679.6
         },
         {
            "PRICE_B":781.6
         },
         {
            "PRICE_C":938
         }
      ]
   },
   {
      "_id":1,
      "price":[
         {
            "PRICE_A":3098.67
         },
         {
            "PRICE_B":3166.67
         },
         {
            "PRICE_C":3800
         }
      ]
   }
]
 

Я использую этот запрос —
https://mongoplayground.net/p/Ajaw4SFVpzg

Ответ №1:

Прямого способа сделать это нет, вам нужно улучшить дизайн вашей схемы, иначе этот запрос повлияет на производительность,

  • $addFields для создания нового настраиваемого поля p
  • $arrayElemAt чтобы получить первое значение цены, передав его ключевое имя, здесь вы должны передать свое динамическое имя ценового ключа
  • $sort по p возрастанию
  • $unset удалить p ключ, потому что он сейчас не нужен
   {
    "$addFields": {
      "p": { "$arrayElemAt": ["$price.PRICE_A", 0] }
    }
  },
  { "$sort": { "p": 1 } },
  { "$unset": "p" }
 

Игровая площадка