Агрегированная сортировка MongoDB разных ответов для одних и тех же значений

#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 и повторить попытку.