Я пытаюсь отсортировать уникальные значения в массивах в нескольких полях из коллекции mongoDB (с драйвером nodeJS).
небольшой набор данных:
[{
"_id" : "5c93db3dd0184516406013f7",
"filters" : {
"genres" : [
{
"_id" : "9CXBYc4qP8sqcNMZ5",
"fr" : "Art Abstrait",
"en" : "Abstract Art",
"de" : "Abstrakte Kunst",
"it" : "Arte astratta",
"es" : "Arte Abstracto"
}
],
"subjects" : [
{
"_id" : "3QjL6YSfmuY6NFHGG",
"fr" : "Abstrait",
"en" : "Abstract",
"de" : "Abstrakt",
"it" : "Astratto",
"es" : "Abstracto"
}
],
"type" : {
"_id" : "CYK2WcepkJsy5xXMo",
"fr" : "Gravure au carborundum",
"en" : "Carborundum etching",
"de" : "Carborundum Radierung",
"it" : "Incisione carborandum",
"es" : "Grabado al Carborundum"
}
}
},
{
"_id" : "5c93db3ed0184516406013f8",
"filters" : {
"genres" : [
{
"_id" : "9CXBYc4qP8sqcNMZ5",
"fr" : "Art Abstrait",
"en" : "Abstract Art",
"de" : "Abstrakte Kunst",
"it" : "Arte astratta",
"es" : "Arte Abstracto"
}
],
"subjects" : [
{
"_id" : "3QjL6YSfmuY6NFHGG",
"fr" : "Abstrait",
"en" : "Abstract",
"de" : "Abstrakt",
"it" : "Astratto",
"es" : "Abstracto"
}
],
"type" : {
"_id" : "CYK2WcepkJsy5xXMo",
"fr" : "Gravure au carborundum",
"en" : "Carborundum etching",
"de" : "Carborundum Radierung",
"it" : "Incisione carborandum",
"es" : "Grabado al Carborundum"
}
}
},
{
"_id" : "5c93e19ed018451640601da6",
"filters" : {
"genres" : [
{
"_id" : "9CXBYc4qP8sqcNMZ5",
"fr" : "Art Abstrait",
"en" : "Abstract Art",
"de" : "Abstrakte Kunst",
"it" : "Arte astratta",
"es" : "Arte Abstracto"
}
],
"subjects" : [
{
"_id" : "3QjL6YSfmuY6NFHGG",
"fr" : "Abstrait",
"en" : "Abstract",
"de" : "Abstrakt",
"it" : "Astratto",
"es" : "Abstracto"
}
],
"type" : {
"_id" : "KfGWEHL2pAto8nfze",
"fr" : "Gravure",
"en" : "Etching",
"de" : "Radierung",
"it" : "Incisione",
"es" : "Grabado"
}
}
}]
результат моегозапрос (с lang = 'en'
):
{
"subjects": [
{
"_id": "3QjL6YSfmuY6NFHGG",
"fr": "Abstrait",
"en": "Abstract",
"de": "Abstrakt",
"it": "Astratto",
"es": "Abstracto"
},
{
"_id": "3QjL6YSfmuY6NFHGG",
"fr": "Abstrait",
"en": "Abstract",
"de": "Abstrakt",
"it": "Astratto",
"es": "Abstracto"
}
],
"genres": [
{
"_id": "9CXBYc4qP8sqcNMZ5",
"fr": "Art Abstrait",
"en": "Abstract Art",
"de": "Abstrakte Kunst",
"it": "Arte astratta",
"es": "Arte Abstracto"
},
{
"_id": "9CXBYc4qP8sqcNMZ5",
"fr": "Art Abstrait",
"en": "Abstract Art",
"de": "Abstrakte Kunst",
"it": "Arte astratta",
"es": "Arte Abstracto"
}
],
"types": [
{
"_id": "CYK2WcepkJsy5xXMo",
"fr": "Gravure au carborundum",
"en": "Carborundum etching",
"de": "Carborundum Radierung",
"it": "Incisione carborandum",
"es": "Grabado al Carborundum"
},
{
"_id": "KfGWEHL2pAto8nfze",
"fr": "Gravure",
"en": "Etching",
"de": "Radierung",
"it": "Incisione",
"es": "Grabado"
}
]
}
конвейер для агрегации:
[
{ $unwind: '$filters.subjects' },
{ $unwind: '$filters.genres' },
{ $group: {
_id: null,
subjects: { $addToSet: '$filters.subjects' },
types: { $addToSet: '$filters.type' },
genres: { $addToSet: '$filters.genres' },
}},
{ $unwind: '$subjects' },
{ $unwind: '$genres' },
{ $unwind: '$types' },
{ $sort: {
[`subjects.${lang}`]: 1,
[`types.${lang}`]: 1,
[`genres.${lang}`]: 1,
}},
{ $group: {
_id: null,
subjects: { $push: '$subjects' },
types: { $push: '$types' },
genres: { $push: '$genres' },
}},
{ $project: {
_id: false,
subjects: '$subjects',
types: '$types',
genres: '$genres'
}}
]
Вместо того, чтобы получать отсортированные массивы уникальных значений следующим образом: [A, B, C, D, ...]
Я получаю отсортированные массивы с неуникальными значениями следующим образом: [A, A, A, B, B, B, C, C, C, D, D, D, ...]
Делая бесполезной группировку $addToSet
.
Есть идеи, что я ошибся?