#database #mongodb #sorting #aggregate
#База данных #mongodb #сортировка #агрегировать
Вопрос:
когда я разбивал на страницы с помощью агрегации mongodb, я обнаружил проблему. Я немного расскажу об этом. Эта проблема возникает только при сортировке. Я создал шаблон, чтобы упростить его. Модель имеет количество (число), генерируемое случайным образом для сортировки, и имеет идентификатор (номер), чтобы мы могли сделать это визуально, и оно уникально.
Агрегированный конвейер, подобный
db.getCollection('test').aggregate([{
$sort:{
count:-1
}
},
{
$skip : 0
},
{
$limit :2
}])
Пример ограничения 2
Возвращенные данные
/* 1 */
{
"_id" : ObjectId("6027005ffba493078dca3580"),
"count" : 9,
"id" : 38
}
/* 2 */
{
"_id" : ObjectId("6027005ffba493078dca3565"),
"count" : 9,
"id" : 11
}
При ограничении пример 3
Возвращенные данные
/* 1 */
{
"_id" : ObjectId("6027005ffba493078dca3587"),
"count" : 9,
"id" : 45
}
/* 2 */
{
"_id" : ObjectId("6027005ffba493078dca3580"),
"count" : 9,
"id" : 38
}
/* 3 */
{
"_id" : ObjectId("6027005ffba493078dca3565"),
"count" : 9,
"id" : 11
}
Для предела 2 идентификатор первого элемента = 38,
для предела 3 идентификатор первого элемента = 45
И его возвращаемый всегда разный ответ для другого значения предельного пропуска для сортировки по одному и тому же значению. Эта проблема мешает мне правильно разбивать страницы на страницы.
Если я добавлю второй пример сортировки
$sort:{
count:-1
_id: 1
}
}
Это разрешено.
В чем причина? и другое решение?
Комментарии:
1. По умолчанию mongo выводит значения в том порядке, в котором они найдены, поэтому нет «сортировки по умолчанию» или другого способа сделать это, только сортировать по желаемым значениям.
Ответ №1:
Это ожидаемое поведение, когда документ с идентификатором: 45 вставляется сразу после выполнения примера агрегации limit: 2 , пример limit: 3 покажет вам документ с идентификатором: 45 на первом месте, поскольку документы / индексы загружаются для сортировки на основе естественного порядка вставки по document _id и_id монотонно увеличивается уже отсортированным. Исходя из вышесказанного, я не думаю, что это имеет какое-либо значение, если вы добавите также _id на этапе сортировки, поскольку документы будут автоматически отсортированы на основе _id, если он не указан, а значение count одинаково для всех документов…
Комментарии:
1. идентификатор 45 не вставляется после агрегации. Он вставляется перед агрегацией. Я согласен с некоторыми вашими ответами. Но когда я добавляю _id в сортировку, проблем нет. И, как и указанное другое предельное значение, возвращает другую сортировку.
2. Провел некоторое тестирование в версии 4.4, и я не вижу такой случайности в поведении, если только в агрегации не было каких-то других этапов до $sort и не сохранен естественный порядок документов, какую версию mongod вы используете?
3. в mongo версии 4.2.3 вы можете создать пример 1 тыс. данных dumy, посчитать число от 1 до 10 и повторить попытку.