Лучше всего перегруженный запрос mongodb - Nodejs; агрегат, группа, фрагмент и поиск - PullRequest
0 голосов
/ 02 апреля 2020

это мой первый вопрос на этом форуме. (Я спикер sh, извините за основание c Engli sh)

У меня есть 3 коллекции: изображения, художники и выставки.

  1. Изображения имеют : имя файла (уникальное), путь и _id и др. c.
  2. Артисты имеют: имя, URL (уникальный) и описание и др. c
  3. Выставки имеют: имя, URL ( уникальный), год, аннотация, aristUrl (artist.url) imageCover (image.fieldname) и др. c.

В моем запросе это мой краткий результат:

[
        _id: null,
        documents: [{...}, {...}],
        totalExhibitions: 2
]

Полный результат

[
    {
        "_id": null,
        "documents": [
            {
                "_id": "5e84d6599891212db0a6dc7e",
                "url": "chile",
                "imageCover": [
                    {
                        "path": "http://localhost:2616/uploads/images/1585763637647.jpg"
                    }
                ],
                "name": "Almacén Verdad y Justicia",
                "year": 2010,
                "releaseDate": "2010-08-30T00:00:00.000Z",
                "artist": [
                    {
                        "name": "Bernardo de Castro Saavedra",
                        "url": "bernardo-castro-saavedra"
                    }
                ]
            },
            {
                "_id": "5e84e0575a3f201aac2df1c2",
                "url": "sin-cera",
                "imageCover": [
                    {
                        "path": "http://localhost:2616/uploads/images/1585766437587.jpg"
                    }
                ],
                "name": "Sin cera",
                "year": 2020,
                "releaseDate": "2020-01-31T00:00:00.000Z",
                "artist": [
                    {
                        "name": "Gonzalo Tapia",
                        "url": "gonzalo-tapia"
                    }
                ]
            }
        ],
        "totalExhibitions": 2
    }
]

Это мой код


getByLastYear(){
        const documents = this.mongoDB.aggregate([
            {
                $addFields: {
                    "artistObjectId": { $toObjectId: "$artistId" }
                }
            },{
                $lookup: {
                    from: 'artists',
                    localField: 'artistObjectId',
                    foreignField: "_id",
                    as: "artist"
                },
            },{
                $lookup: {
                    from: 'images',
                    localField: 'imageCover',
                    foreignField: "filename",
                    as: "imageCover"
                },
            },{
                $project: {
                    name: 1,
                    year: 1,
                    url: 1,
                    releaseDate: 1,
                    artist: {
                        name: 1,
                        url: 1
                    },
                    imageCover: {
                        path: 1,
                        alt: 1,
                    }

                }
            }, {
                $group: {
                    _id: null,
                    documents: {
                        $push: "$$ROOT"
                    },
                    totalExhibitions: {
                        $sum: 1
                    }

                }
            }

        ]);
        return documents || [];
    };

, который является лучшей формой для получения моего результата? Есть ли что-нибудь лучше?

Спасибо за ваши комментарии и мнения. <3 </p>

1 Ответ

1 голос
/ 02 апреля 2020

Предполагая, что:

  • вы начинаете с коллекции выставок;
  • поля "_id" имеют формат ObjectId;
  • есть только 1 художник и 1 изображение обложки для каждой выставки ...

Я бы пропустил первый шаг и добавил бы этапы $ unwind, чтобы художник и изображение обложки были вложенным документом, а не массивом. Причина этого в том, что будет проще ссылаться на результат.

Это должно быть в состоянии запускаться в вашей оболочке Mon go:

db.exhibitions.aggregate([
{ $lookup: {
    from: 'artists',
    localField: "artistId",
    foreignField: "_id",
    as: "artist"
}},
{ $unwind: {
    path: "$artist",
    preserveNullAndEmptyArrays: true
}},
{ $lookup: {
    from: 'images',
    localField: 'imageCover',
    foreignField: "filename",
    as: "imageCover"
}},
{ $unwind: {
    path: "$imageCover",
    preserveNullAndEmptyArrays: true
}},
{ $project: {
    name: 1,
    year: 1,
    url: 1,
    releaseDate: 1,
    artist: {
      name: "$artist.name",
      url: "$artist.url"
    },
    imageCover: {
      path: "$imageCover.path",
      alt: "$imageCover.alt",
    }
}},
{ $group: {
    _id: null,
    documents: {
      $push: "$$ROOT"
    },
    totalExhibitions: {
      $sum: 1
    }
}}
]);

В проекте "$ "stage, для artist и imageCover, вам нужно будет указать полный путь для создания сокращенного поддокумента.

Надеюсь, что ответил на ваш вопрос ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...