Как запрашивать и сортировать естественно в MongoDB? - PullRequest
1 голос
/ 16 апреля 2019

У меня есть mongoDB, содержащий миллионы документов.

Я хочу запросить базу данных и отсортировать результаты естественным образом, используя определенное поле.

Из документации Mongo кажется, что поддерживается только наивная сортировка. Есть ли способ сортировки естественно?

Пример:

  • doc 1 _id: "abc10.def"
  • doc 2 _id: "abc2.def"
  • doc 3 _id: "abc1.def"

Запрос: db_collection.find({}).sort({_id: 1})

возвращает список по порядку:

  • doc3 ("abc1.def")
  • doc1 ("abc10.def")
  • doc2 ("abc2.def")

как сортировать, чтобы получить следующий список?

  • doc3 ("abc1.def")
  • doc2 ("abc2.def")
  • doc1 ("abc10.def")

1 Ответ

1 голос
/ 16 апреля 2019

Проблема здесь в том, что более короткие строки должны быть возвращены раньше, чем более длинные, а затем вы должны отсортировать строки в алфавитном порядке одинаковой длины.Для этого вам нужно временное поле length, которое можно добавить с помощью $ strLenBytes .

db.col.aggregate([
    {
        $addFields: {
            length: { $strLenBytes: "$_id" }
        }
    },
    {
        $sort: {
            length: 1, _id: 1
        }
    },
    {
        $project: {
            length: 0
        }
    }
])
...