Mongodb агрегационный массив, неправильно сортирует - PullRequest
0 голосов
/ 19 апреля 2020

В моей коллекции MongoDB есть поле с массивом ObjectId. Этот массив содержит порядок появления ObjectIds в списке. Это происходит тогда, когда я пытаюсь использовать $ lookup в агрегации, это сортирует мой массив по порядку создания.

Когда я использую только:

$project: {
                list: 1
            }

, результат - правильный порядок элементов:

[
  5e9b7dc0500c9a5c3809b0c8,
  5e9b7efad230686164a64bdb,
  5e9b7dfc6244792818f7cdba,
  5e9b7e355a7c843e90a2ed48,
  5e9b7e86efb9111d1c91ea77,
  5e9b7eb26463144eac64cb16
]

, и когда я использую поиск, изменение порядка:

$lookup: { 
        from: 'users',
        localField: 'user',
        foreignField: '_id',
        as: 'list'
    }
},
{
    $project: {
        list: 1
    }
}

это результат

[
{_id: 5e9b7dc0500c9a5c3809b0c8 },
{_id: 5e9b7dfc6244792818f7cdba },
{_id: 5e9b7e355a7c843e90a2ed48 },
{_id: 5e9b7e86efb9111d1c91ea77 },
{_id: 5e9b7eb26463144eac64cb16 },
{_id: 5e9b7efad230686164a64bdb }
]

Может ли кто-нибудь помочь мне с этим?

edit:

Использование findOne (). Populate () вместо aggregate () было для меня более легкой альтернативой.

1 Ответ

0 голосов
/ 19 апреля 2020

Этап $lookup возвращает поля в том порядке, в котором они встречаются при запросе к коллекции from. Поскольку foreignField равно _id, исполнитель запросов, вероятно, будет использовать индекс {_id:1} для поиска этих документов, что означает, что они будут встречаться в порядке их появления в этом индексе, т.е. отсортированы по _id. Так как первые биты ObjectId - это время эпохи, в которое был создан идентификатор, это даст их вам в порядке создания.

Если вам нужно, чтобы поля были в указанном порядке c, вы будете необходимо добавить поле к просматриваемым документам, по которому можно выполнить сортировку, или $unwind массив перед поиском, чтобы при каждом поиске возвращался один документ, а $group результаты возвращались обратно в массив.

...