Как использовать раскрутку для получения нескольких документов и нескольких документов (цепочка)? - PullRequest
0 голосов
/ 14 октября 2019

Я создаю проект с Node и MongoDB. База данных содержит несколько коллекций и документов. Таблица Project содержит несколько записей, и существует множество программ. У каждой программы есть много спикеров. Когда я использовал следующий код, он отображает только динамики одной программы

Пробный код

function getOne(req,res,next)
{
    try
    {          
        var aggregate = Project.aggregate();

        aggregate.match({"_id":ObjectId(id)})
        .lookup({ from: "programmes", localField: "_id", foreignField: "Project_id",as: "programme_doc"})
        .unwind("$programme_doc")
        .lookup({ from: "gust_speakers", localField: "programme_doc._id", foreignField: "programme_id",as: "programme_doc.speakers"})
        .lookup({ from: "status", localField: "Project_status_id", foreignField: "_id",as: "status_doc"})
        .lookup({ from: "guests", localField: "_id", foreignField: "Project_id",as: "guest_doc"})
        .lookup({ from: "second_manager", localField: "_id", foreignField: "Project_id",as: "team_doc"})
        .lookup({ from: "users", localField: "team_doc.user_id", foreignField: "_id",as: "team_docc"})
        .lookup({ from: "type", localField: "Project_category_id", foreignField: "_id",as: "category_doc"})
        .lookup({from: "feedbacks", localField: "_id", foreignField: "Project_id",as: "feedbacks"})
        .lookup({from: "feedbacks", localField: "_id", foreignField: "programme_doc._id",as: "pro_feedbacks"})
        .lookup({from: "links", localField: "_id", foreignField: "Project_id",as: "link_doc"       

        Project.aggregatePaginate(aggregate, options, function(err, results, pageCount, count)
        {
            Status.find({}).select("_id name color").exec(function(err, statusResult) {
                    if (!err) {
                        ProjectStatus.find({}).select("_id name dp").exec(function(err, eveResult) {

                            if (!err) {
                                return res.status(200).json({data:results[0],pro_status:statusResult,pro_status:proResult});
                            }
                        });
                    }
                });
        }) 
    }
    catch (err)
    {
        return res.status(500).json(err);
    }
}

Пример вывода

{
    "data": {        
        },
    "programme_doc": {
        // program details
        ,
        "speakers": [
            {
                //speaker 1
            },
            {
                //speaker 2
            }
        ]
    },
}

Но если я прокомментирую строку unwind и следующую lookup следующим образом, она покажет все детали программы без сведений о динамике.

aggregate.match({"_id":ObjectId(id)})
.lookup({ from: "programmes", localField: "_id", foreignField: "Project_id",as: "programme_doc"})
//.unwind("$programme_doc")
//.lookup({ from: "gust_speakers", localField: "programme_doc._id", foreignField: "programme_id",as: "programme_doc.speakers"})
.lookup({ from: "status", localField: "Project_status_id", foreignField: "_id",as: "status_doc"})

//rest of codes

output

{
    "data": {        
        },
    "programme_doc": [
        {
            // program details
        },
        {
            // program details
        },
        {
            // program details
        },
        {
            // program details
        },
    ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...