MongoDB версии 3.4 сортировка строк по номерам с агрегатом - PullRequest
0 голосов
/ 28 февраля 2020

У меня есть номер продукта sku в формате строки, например "500011", и я хочу отсортировать, чтобы получить весь продукт с сортировкой sku по убыванию в версии mongoDB 3.4.

db.getCollection('products').aggregate([
  {$match:{catId:'5e0af7cb6423d67d7d2a38d2'}},
  {$sort:{"sku": -1}}, //sku is a string number value like "500011"
])

1 Ответ

3 голосов
/ 28 февраля 2020

Как уже упоминал Джо, в этом вам может помочь сортировка.

db.products.aggregate(
[{$sort: {"sku": -1}}], 
{collation: {locale: "en", numericOrdering: true}})

Пример вывода:

{ "_id" : ObjectId("5e58d89fe0aba047483c3bbc"), "sku" : "500012" }
{ "_id" : ObjectId("5e58d89de0aba047483c3bbb"), "sku" : "500011" }
{ "_id" : ObjectId("5e58d8a3e0aba047483c3bbe"), "sku" : "404012" }
{ "_id" : ObjectId("5e58d8a0e0aba047483c3bbd"), "sku" : "400012" }
{ "_id" : ObjectId("5e58d8abe0aba047483c3bbf"), "sku" : "90000" }
{ "_id" : ObjectId("5e58d8aee0aba047483c3bc0"), "sku" : "1000" }

Но если sku , то на самом деле всегда число почему бы не сохранить его как номер в базе данных? Тогда сортировка должна работать из коробки без каких-либо дополнительных параметров сортировки.

Но учтите:

Использование параметров сортировки и индекса

Использование индекса для сравнения строк операция также должна указывать такое же сопоставление. То есть индекс с сопоставлением не может поддерживать операцию, которая выполняет сравнение строк в индексированных полях, если в операции задано другое сопоставление.

Из-за этого ИМХО вам следует просто сохранить sku в качестве числа в базе данных, если это возможно, и сортировать его без сортировки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...