#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