【问题标题】:How I can make sub-query in mongoose same as mysql?如何在 mongoose 中进行与 mysql 相同的子查询?
【发布时间】:2020-06-17 21:10:09
【问题描述】:

我是 mongo 的新手。我在项目中有一个问题,在 mongo 中进行子查询与 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"
}

现在我想检查所有问题以及用户提交的答案。如果用户没有回答任何问题,它将显示为空。我认为这个 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

我不想使用循环,因为它会减慢响应速度。因为我有 200 多个问题。

请帮我解决这个问题

【问题讨论】:

  • 在 MongoDB 中,这是通过聚合管道完成的。
  • 嗨@D.SM,感谢您的回复。你能给我猫鼬的示例代码吗?我使用聚合,但我不了解聚合的详细信息。请帮我整理一下。谢谢

标签: node.js mongodb mongoose subquery mongoose-schema


【解决方案1】:

我找到了答案。看看下面。

它和我的 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
                }
            }
        ]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-31
    相关资源
    最近更新 更多