как я могу применить сортировку в строке в mongodb

#mongodb #mongodb-query #aggregation-framework #php-mongodb

#mongodb #mongodb-запрос #агрегация-фреймворк #php-mongodb

Вопрос:

это мой образец документа

 {
  "string" : "class.chapter.1.topic.10"
}
 

как я могу отсортировать эту строку в соответствии с «chapter.anynumber.topic.anynumber»

Комментарии:

1. будет ли строка всегда начинаться с «class». или вы пытаетесь отрезать все до первой точки?

Ответ №1:

Не совсем научный, но вот один из способов:

 db.collection.aggregate([
  {
    "$project": {
      string: "$string",
      chapter_num: {
        "$toInt": {
          $arrayElemAt: [
            {
              $split: [
                "$string",
                "."
              ]
            },
            2
          ]
        }
      },
      topic_num: {
        "$toInt": {
          $arrayElemAt: [
            {
              $split: [
                "$string",
                "."
              ]
            },
            4
          ]
        }
      }
    }
  },
  {
    $sort: {
      chapter_num: 1,
      topic_num: 1
    }
  },
  {
    "$project": {
      string: "$string"
    }
  }
])
 

Что он делает, так это разбивает строку на . , затем берет элементы 2 и 4 как chapter_num и topic_num из результирующего массива, преобразует их в Int и сортирует с помощью:

   {
    $sort: {
      chapter_num: 1,
      topic_num: 1
    }
  }
 

переключение между 1 и -1 для перехода к asc или desc.

Обратите внимание, что это предполагает, что ваша строка будет соответствовать этому формату : xxx.xxx.num.xxx.num .

Если используется для этой выборки:

 [
  {
    "string": "class.chapter.1.topic.10"
  },
  {
    "string": "class.chapter.2.topic.3"
  },
  {
    "string": "class.chapter.1.topic.12"
  },
  {
    "string": "class.chapter.1.topic.1"
  }
]
 

Результатом будет:

 [
  {
    "_id": ObjectId("5a934e000102030405000003"),
    "string": "class.chapter.1.topic.1"
  },
  {
    "_id": ObjectId("5a934e000102030405000000"),
    "string": "class.chapter.1.topic.10"
  },
  {
    "_id": ObjectId("5a934e000102030405000002"),
    "string": "class.chapter.1.topic.12"
  },
  {
    "_id": ObjectId("5a934e000102030405000001"),
    "string": "class.chapter.2.topic.3"
  }
]
 

Игровая площадка: https://mongoplayground.net/p/6-2QRIppu0u