无法在mongodb查询中执行复杂的嵌套吗?

问题描述 投票:1回答:1

我正在使用架构rtoreqs:-

{
    "status": 0,
    "isSafe": true,
    "isDeleted": false,
    "_id": "5ee9c426e9f4d429a47b3d5f",
    "name": "TESTVisitor1",
    "mobile": "123456780",
    "email": "[email protected]",
    "empId": "028207",
    "visitingDate": "2020-06-16T00:00:00.000Z",
    "visitingTime": "05:00AM",
    "currentLocation": "ADDR1",
    "created": "2020-06-17T07:20:06.933Z",
    "updated": "2020-06-17T07:20:06.933Z",
    "__v": 0,
    "id": "5ee9c426e9f4d429a47b3d5f"
}

并且具有模式questionsAnswered,其中的字段reqId包含rtoreqsId的ID:-

{
    "_id": "5ee9c427e9f4d429a47b3d60",
    "isDeleted": false,
    "reqId": "5ee9c426e9f4d429a47b3d5f",
    "questions": [
        {
        "comment": "",
        "questionId": "5ee873e50a1863139cd8d446",
        "optionSelected": 1
        }, 
       {
        "comment": "",
        "questionId": "5ee87af0b6241f2a08a88f5a",
        "optionSelected": 2
        }
      ],
    "created": "2020-06-17T07:20:07.143Z",
    "updated": "2020-06-17T07:20:07.143Z",
    "__v": 0
}

并且有一个问题模式,其中上面的模式具有如下每个问题ID到问题模式ID的映射

[
    {
        "_id": "5ee873e50a1863139cd8d446",
        "name": "Sample Question",
        "options": [
            {
                "id": 2,
                "title": "No"
            },
            {
                "id": 1,
                "title": "Yes"
            }
        ]
    },
    {
        "_id": "5ee87af0b6241f2a08a88f5a",
        "name": "Sample Question2",
        "options": [
            {
                "id": 2,
                "title": "No"
            },
            {
                "id": 1,
                "title": "Yes"
            }
        ]
    }
]

和iver在组合rtoreq和问题时执行了聚合,并通过以下查询回答:-

rtoreqs.aggregate(
[
  {
    '$lookup': {
      'from': 'questionsanwereds', 
      'localField': '_id', 
      'foreignField': 'reqId', 
      'as': 'questionsAnswereds'
    }
  }, {
    '$unwind': {
      'path': '$questionsAnswereds'
    }
  }, {
    '$project': {
      'questionsAnswereds._id': 0, 
      'questionsAnswereds.isDeleted': 0, 
      'questionsAnswereds.reqId': 0, 
      'questionsAnswereds.created': 0, 
      'questionsAnswereds.updated': 0
    }
  }
]
)

其结果是:-

{
   "_id":"5ee9c426e9f4d429a47b3d5f",
   "status":0,
   "isSafe":true,
   "isDeleted":false,
   "name":"TESTVisitor1",
   "mobile":"123456780",
   "email":"[email protected]",
   "empId":"028207",
   "visitingDate":"2020-06-16T00:00:00.000+00:00",
   "visitingTime":"05:00AM",
   "currentLocation":"ADDR1",
   "created":2020-06-17T07:20:06.933+00:00,
   "updated":2020-06-17T07:20:06.933+00:00,
   "questionsAnswereds":{
      "questions":[
         {
            "comment":"",
            "questionId":"5ee873e50a1863139cd8d446",
            "optionSelected":1
         },
         {
            "comment":"",
            "questionId":"5ee87af0b6241f2a08a88f5a",
            "optionSelected":2
         }
      ]
   }
}

现在我想用相应的questionId中存在的名称替换questionId。但是我无法做到这一点

node.js mongodb mongodb-query mongoose-schema
1个回答
0
投票

您可以通过多种方式执行此操作,以下是嵌套$lookup的示例:

[
    {
        '$lookup': {
            'from': 'questionsanwereds',
            'let': {id: '$_id'},
            "pipeline": [
                {
                    $match: {
                        $expr: {
                            $eq: ["$$id", "$reqId"]
                        }
                    }
                },
                {
                    $unwind: "$questions"
                },
                {
                    $lookup: {
                        from: "questions",
                        localField: "$questionId",
                        foreignField: "_id",
                        as: "questionObj"
                    }
                },
                {
                    "$unwind": "$questionObj"
                },
                {
                    $group: {
                        _id: "$_id",
                        questions: {
                            $push: {
                                comment: "$comment",
                                name: "$questionObj.name",
                                optionSelected: "$optionSelected"
                            }
                        }
                    }
                }
            ],
            'as': 'questionsAnswereds'
        }
    },
    {
        '$unwind': {
            'path': '$questionsAnswereds'
        }
    }
]

该策略是分别填充每个问题的名称,然后分组以恢复所需的结构。

© www.soinside.com 2019 - 2024. All rights reserved.