Как сделать подзапрос в пн goose таким же, как mysql? - PullRequest
0 голосов
/ 18 июня 2020

Я новенький go. У меня есть проблема в проекте сделать подзапрос в пн go так же, как mysql. Пожалуйста, проверьте ниже.

У меня 2 коллекции

Коллекция 1 -> Вопросы

{
    "_id":"5ee9357528232c325c57b0f5",
    "question": "What is true happiness ?",
    "status": 1,
    "category_id": "5ee9352d28232c325c57b0f1",
    "created_at": "2020-06-16T21:11:17.795Z",
    "updated_at": "2020-06-16T21:11:17.795Z",
}

Коллекция 2 -> submit_answers

{
    "_id": "5ee94254674c5f26043745c8",
    "answer": "True happiness is the happiness of soul",
    "status": 1,
    "user_id": "5ed5f3db4ca9ff26e4dfc972",
    "question_id": "5ee93bc5b3d8d828f01e4ced",
    "created_at": "2020-06-16T22:06:12.509Z",
    "updated_at": "2020-06-16T22:41:58.295Z"
}

Теперь я хочу проверить получить все вопросы с ответами, отправленными пользователями. Если пользователь не ответит ни на один вопрос, он будет отображаться как null. Я думаю, этот запрос SQL лучше объяснит, в чем моя проблема.

let user_id = 1

SELECT *,(SELECT answer FROM submit_answers sa WHERE q.question_id=sa.question_id AND user_id="user_id") as answer FROM questions q

Я не хочу использовать l oop, потому что это замедлит реакцию. Потому что у меня 200+ вопросов.

Пожалуйста, помогите мне решить эту

1 Ответ

0 голосов
/ 28 июня 2020

Я нашел ответ. Посмотрите ниже.

Он работает так же, как мой Sql Запрос

let user_id = 1

SELECT *,(SELECT answer FROM submit_answers sa WHERE q.question_id=sa.question_id AND user_id="user_id") as answer FROM questions q

let questions = await Question.aggregate([
            {
                $match: {
                    status: 1,
                    category_id: categories[i]._id
                }
            }, {
                $lookup: {
                    from: 'submit_answers',
                    let: {question_id: "$_id", user_id: mongoose.Types.ObjectId(req.user.id)},
                    pipeline: [
                        {
                            $match: {
                                $expr: {
                                    $and: [
                                        {
                                            $eq: ["$question_id", "$$question_id"]
                                        },
                                        {
                                            $eq: ["$user_id", "$$user_id"]
                                        },
                                    ]
                                }
                            }
                        },
                        {
                            $project: {
                                "answer": 1, "_id": 1, "status": 1, "created_at":1
                            }
                        }
                    ],
                    as: "answer"
                }
            },
            {
                $unwind: {
                    "path": "$answer",
                    "preserveNullAndEmptyArrays": true
                }
            }
        ]);
...