Как фильтровать, используя агрегат и $ lookup в mongoose? - PullRequest
0 голосов
/ 13 октября 2019

У меня есть список вопросов для пациента, у каждого пациента есть идентификатор в mongoDB (Patient ID). В каждом вопросе у меня много комментариев (я разделяю каждый комментарий по типу комментария: type = "ask" для комментария к последующему примечанию пациента, type = "answer" для комментария врача) Я хочу вернуть массив комментариев, но отфильтровать поtype = "ask", как мне это сделать. В настоящее время я возвращаю только по массиву всех комментариев, включая пациента и доктора. Я использую агрегат и поиск, как это. Как я могу фильтровать по типу? Пожалуйста, помогите мне? Спасибо

findQuestionByPatientId(req, res, next){
        Questions.aggregate([
            {
                $match: {
                    $and:[{"patientId":ObjectId(req.params.patientId)}]
                }
            },
            {

              $lookup:
                {
                  from: "comments", // at present It's list all comments include type ="ask" and type = "answer". I want to filter only comment with type ="ask"
                  localField: "_id",
                  foreignField: "questionId",
                  as: "comments"
                }
           }
        ]).then(data => {
            res.send({"data": data, "resultCode": 1, "message " : ""});
        });

    }

Ниже приведены примеры данных, в списке есть 2 вопроса:

{
    "data": [
        {
            "_id": "5d8385844ad1d5001058f220",
            "patientId": "5c80930d447df7735138693e",
            "title": "I have a stomachache",
            "askFor": "myself",
            "age": 28,
            "gender": "",
            "askContent": "I have a stomachache, please give me a prescription",
            "attachment": "5d8385844ad1d5001058f21f",
            "askToDoctor": "5d1cd947231ceb95b8838c1b",
            "createdBy": "5c80930d447df7735138693e",
            "askStatus": "Awaiting Reply",
            "approvedBy": "",
            "approved": false,
            "createdAt": "2019-09-19T13:41:24.874Z",
            "updatedAt": "2019-09-19T13:41:24.874Z",
            "__v": 0,
            "comments": [
                {
                    "_id": "5da0039d9a3d852cf08aa89d",
                    "content": "I sent my image in attached file",
                    "type": "ask",
                    "questionId": "5d8385844ad1d5001058f220",
                    "approved": false,
                    "createdBy": "5d1cd947231ceb95b8838c1b",
                    "attachedFile": null,
                    "approvedBy": "5d1cd947231ceb95b8838c1b",
                    "createdAt": "2019-10-11T04:22:53.538Z",
                    "updatedAt": "2019-10-11T04:22:53.538Z",
                    "__v": 0
                },
                {
                    "_id": "5da003a39a3d852cf08aa89f",
                    "content": "Doctor, plz give me a detail guide",
                    "type": "ask",
                    "questionId": "5d8385844ad1d5001058f220",
                    "approved": false,
                    "createdBy": "5d1cd947231ceb95b8838c1b",
                    "attachedFile": null,
                    "approvedBy": "5d1cd947231ceb95b8838c1b",
                    "createdAt": "2019-10-11T04:22:59.105Z",
                    "updatedAt": "2019-10-11T04:22:59.105Z",
                    "__v": 0
                },
                {
                    "_id": "5da003aa9a3d852cf08aa8a1",
                    "content": "I sent you the guide to take medicine in attached",
                    "type": "reply",
                    "questionId": "5d8385844ad1d5001058f220",
                    "approved": false,
                    "createdBy": "5d1cd947231ceb95b8838c1b",
                    "attachedFile": null,
                    "approvedBy": "5d1cd947231ceb95b8838c1b",
                    "createdAt": "2019-10-11T04:23:06.896Z",
                    "updatedAt": "2019-10-11T04:23:06.896Z",
                    "__v": 0
                }
            ]
        },
        {
            "_id": "5d8b2e9406e021904a797838",
            "patientId": "5c80930d447df7735138693e",
            "title": "I got a flu",
            "askFor": "Myseft",
            "age": 34,
            "gender": "",
            "askContent": "I got a flu, please give me a medicine",
            "attachment": "5d8b2e9406e021904a797837",
            "askToDoctor": "5d1cd947231ceb95b8838c1b",
            "createdBy": "5c80930d447df7735138693e",
            "askStatus": "Awaiting Reply",
            "approvedBy": "",
            "approved": false,
            "createdAt": "2019-09-25T09:08:36.891Z",
            "updatedAt": "2019-09-25T09:08:36.891Z",
            "__v": 0,
            "comments": []
        }
    ],
    "resultCode": 1,
    "message ": ""
}

1 Ответ

0 голосов
/ 14 октября 2019

При приведенной ниже агрегации будут возвращены все ваши документы с комментариями, отфильтрованными по типу:

  db.collection.aggregate([
  {
    $addFields: {
      comments: {
        $filter: {
          input: "$comments",
          as: "comment",
          cond: {
            $eq: [
              "$$comment.type",
              "ask"
            ]
          }
        }
      }
    }
  }
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...