невозможно обновить коллекцию mongodb из мутации graphql - PullRequest
1 голос
/ 06 мая 2020

Мне не удается решить следующую проблему. Я взял на себя разработку сервера GraphQL с использованием NodeJS, Apollo и Mon goose.

Ниже приведены некоторые примеры данных из базы данных:

PrescriptionSetup

{
                "_id": "5ea99ae6fc48d036e083ec20",
                "name": "Calcium",
                "valueTo": -51,
                "valueFrom": -75,
                "treatmentDescription": "Deficiency",
                "recommendation": "<p><strong>Calcium Deficiency</strong></p>\n<p><strong>S &amp; S include: </strong></p>\n<p>Anxiety, Muscle cramps, and spasms, Bruising, Nervousness, Insomnia, Osteoporosis, Tooth decay</p>\n<p><strong>Calcium sources:</strong></p>\n<p>Milk, cheese and other dairy&Acirc;&nbsp;foods. Broccoli, cabbage and okra, Soya beans, Nuts, Flour,&nbsp;Fish</p>",
                "isNormal": false
            },
            {
                "_id": "5ea99ae6fc48d036e083ec21",
                "name": "Calcium",
                "valueTo": 100,
                "valueFrom": 76,
                "treatmentDescription": "High Bio-unavailable",
                "recommendation": "<p><strong>Calcium Excess</strong></p>\n<p><strong>S &amp; S include:</strong></p>\n<p>Arthritis, Gall stones, Constipation, Kidney stones, Depression, Mental, Fatigue.</p>\n<p><strong>Calcium sources:</strong></p>\n<p>Milk, cheese and other dairy&nbsp;foods.Broccoli, cabbage and okra, Soya beans, Nuts, Flour, Fish</p>",
                "isNormal": false
            },
            {
                "_id": "5ea99ae6fc48d036e083ec89",
                "name": "Calcium",
                "valueTo": -26,
                "valueFrom": -50,
                "treatmentDescription": "Border line deficiency",
                "recommendation": "<p><strong>Calcium Borderline Deficiency</strong></p>\n<p><strong>S &amp; S include: </strong></p>\n<p>Fatigue.Weak and brittle fingernails.Poor appetite. Muscle cramps, stiffness, and spasms.</p>\n<p><strong>Calcium sources:</strong></p>\n<p>Milk, cheese and other dairy&Acirc;&nbsp;foods. Broccoli, cabbage and okra, Soya beans.<br /> Nuts. Flour.&nbsp;Fish</p>",
                "isNormal": false
            },
            {
                "_id": "5ea99ae6fc48d036e083ec8a",
                "name": "Calcium",
                "valueTo": -76,
                "valueFrom": -100,
                "treatmentDescription": "insufficiency",
                "recommendation": "<p><strong>Calcium Insufficiency</strong> <br /><strong>S &amp; S include: </strong></p>\n<p>Anxiety, Muscle cramps and spasms, Bruising, Nervousness, Insomnia, Osteoporosis, Tooth decay</p>\n<p><strong>Calcium sources:</strong></p>\n<p>Milk, cheese and other dairy&Acirc;&nbsp;foods.Broccoli, cabbage and okra, Soya beans , Nuts , Flour , Fish</p>",
                "isNormal": false
            },
            {
                "_id": "5ea99ae6fc48d036e083ec22",
                "name": "Magnesium",
                "valueTo": 100,
                "valueFrom": 76,
                "treatmentDescription": "High Bio-unavailable",
                "recommendation": "<p><strong>Magnesium Excess</strong></p>\n<p><strong>S &amp; S include:</strong></p>\n<p>Confusion, Fatigue, Depression, Low blood pressure, Diarrhea, Muscle weakness</p>\n<p><strong>Magnesium sources:</strong></p>\n<p>Spinach, figs, avocado, banana and raspberries. Nuts and seeds. Legumes. Peas, broccoli, cabbage, green beans, artichokes, Seafood</p>",
                "isNormal": false
            },
            {
                "_id": "5ea99ae6fc48d036e083ec53",
                "name": "Magnesium",
                "valueTo": 25,
                "valueFrom": -25,
                "treatmentDescription": "Normal / Ideal zone",
                "recommendation": "",
                "isNormal": true
            },

ParsedPdf

 {
_id: "5eb2da3a4c6ccc6f65d7e621",
"mineralTestReport": 
[
    {
        "name": "Calcium",
        "value": "25",
        "details": null
    },
    {
        "name": "Magnesium",
        "value": "-25",
        "details": null
    },
    {
        "name": "Phosphorus",
        "value": "-71",
        "details": null
    },
    ],
    "ratios": 
    [
        {
            "name": "Ca/Mg",
            "value": "43",
            "details": null
        },
        {
            "name": "Ca/P",
            "value": "100",
            "details": null
        },
        {
            "name": "K/Na",
            "value": "-75",
            "details": null
        },
        {
            "name": "Cu/Zn",
            "value": "-3",
            "details": null
        }
    ]}

Я хотел взять « имя » и « значение . "из каждого массива на ParsedPdf , проверьте, где« значение »находится между« valueFrom »и« valueTo . »из PrescriptionSetup и обновите« деталь », добавив« описание »и« рекомендацию ».

Это это то, что я сделал. Я создал Мутацию:

updateParsePdf: authenticated(async (parent, args, context, info) => {
      try {
        const pdf = await ParsePdf.findById(args._id);
        const newReport = await updatedReport(pdf._doc);
        const reportUpdated = await ParsePdf.findByIdAndUpdate(args._id, {
          newReport,
        }).exec();
          return reportUpdated._doc;
      } catch (error) {
        console.log("error: ", error);
        throw new AuthenticationError("Opps! Something went wrong.", error);
      }
    }),

метод updateReport

    const updatedReport = async (pdf) => {
    //pdf is the response from the ParsedPdf above
  let updated = {};
  try {
    await Object.keys(pdf).forEach((key) => {
      const field = pdf[key];
      if (Array.isArray(field)) {
        const newRep = field.map(async (f) => {
          const pp = PrescriptionSetup.find({
            name: f.name,
            valueFrom: {
              $lte: f.value,
            },
            valueTo: {
              $gte: f.value,
            },
          })
            .exec()
            .then((p) => {
              return {
                ...f,
                details: {
                  description: p[0].treatmentDescription,
                  recommendation: p[0].recommendation,
                  isNormal: p[0].isNormal,
                },
              };
            })
            .catch((e) => {
              console.log("Error finding setup: ", e);
            });
          return pp;
        });
        updated = { ...updated, [key]: [...newRep] };
      }
    });
    const aa = { ...pdf, ...updated };
    return aa;
  } catch (error) {
    console.log("Error...: ", error);
  }
};

Внутри коллекции ParsedPdf много массивов с большим количеством элементов. Я думаю, что из-за огромных запросов к БД я не мог заставить его работать. Как лучше всего решить эту проблему?

Спасибо за помощь

1 Ответ

1 голос
/ 07 мая 2020

Я предлагаю подход с наименьшим изменением кода.

  1. const pp = PrescriptionSetup.find здесь pp - это Promise, поэтому newRep будет массивом Promise s

    вместо [...newRep] используйте [...await Promise.all(newRep)]

  2. await Object.keys(pdf).forEach((key) => ...) здесь .forEach ничего не возвращает, на самом деле вам не нужно await, но мы просто добавили асинхронный c logi c в (1.), поэтому мы должны обработать это

    изменение на await Promise.map(Object.keys(pdf), async (key) => ...), если вы используете bluebird, иначе используйте что-то эквивалентное с Promise.map

...