Как создать уникальный массив в конвейере агрегации mongodb, сохранив порядок - PullRequest
0 голосов
/ 29 мая 2020

Я пытаюсь решить один вариант использования. В конвейере агрегации необходимо создать уникальный массив из одного поля, сохранив порядок путем сортировки документов.

$ addtoset создает уникальный массив, но порядок не сохраняется, тогда как pu sh сохраняет порядок, но допускается наличие дубликатов . Что делать в этом сценарии?

Пример: входные документы в коллекции

{
studentid: 1,
createddate: 2020-05-24
exam:english
}

{
studentid: 1,
createddate: 2020-05-25
exam: maths
}

{
studentid: 1,
createddate: 2020-05-26
exam:physics
}

{
studentid: 1,
createddate: 2020-05-27
exam:maths
}

{
studentid: 1,
createddate: 2020-05-28
exam:chemistry
}

Ожидаемый результат:

{
studentid:1,
exam:[chemistry,maths,physiscs,english]

}

1 Ответ

0 голосов
/ 29 мая 2020

Чтобы получить то, что вы хотите, сначала $ pu sh все значения в массив, затем используйте $ addFields и $ reduce для создания массива уникальных значений.

{$addFields:{
     outputarray:{
        $reduce:{
            input:"$inputArray",
            initialValue:[],
            in:{
              $cond:{
                  if: {$in: [ "$$this", "$$value"]},
                  then: "$$value",
                  else: {$concatArrays:["$$value",["$$this"]]}
              }
           }
        }
    }
}}
...