Как отсортировать выходные данные этапа агрегации сегментов? - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть конвейер агрегации mongodb, состоящий из спички и корзины. Совпадение просто указывает тип документа, который нужно объединить, затем корзина связывает документы на основе их метки времени. Проблема, с которой я сталкиваюсь, заключается в том, что результаты не соответствуют (временному) порядку. На type имеется восходящий индекс, на data.tod.

- нисходящий.

Я попытался добавить этап сортировки между двумя этапами и, похоже, игнорирую его. {$sort:{'data.tod':-1}} Затем я попробовал сортировку после сегмента {$sort:{T:-1}}, что также не повлияло на вывод.

    let cursor = self.collection.aggregate([
        {
            $match: {
                type: 'image',
            }
        },{
            $bucket: {
                groupBy: '$data.tod',
                boundaries: boundsObj.array,
                default: 'ungrouped',
                output: {
                    'data': {$addToSet:{
                            T: '$data.tod',
                            SDN: '$data.shortDirName'
                            }
                        }
                    }
                }
        }],null);

1 Ответ

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

Сортировка перед групповым этапом - это на самом деле ответ, ваша проблема - это addToSet, который не сохраняет порядок документов.

Из официальных документов Монго

Порядок элементов в выходном массиве не определен.

Предполагая, что мы хотим сохранить свойство set после стадии сегмента, наши поля data.T - внутреннее поле, оператор сортировки сортирует документы ине в них.

Вам нужно развернуть это поле, отсортировать его и затем сгруппировать, используя вместо этого оператор push, который сохраняет порядок документов.

{$unwind: '$data'}, 
{$sort: {'data.tod': -1}}, 
{$group: {_id: '$_id', 'data': {$push: '$data'}}})
...