[英]unable to update a mongodb collection from the graphql mutation
我无法解决以下问题。 我使用 NodeJS、Apollo 和 Mongoose 开发了 GraphQL 服务器。
以下是数据库中的一些示例数据:
处方设置
{
"_id": "5ea99ae6fc48d036e083ec20",
"name": "Calcium",
"valueTo": -51,
"valueFrom": -75,
"treatmentDescription": "Deficiency",
"recommendation": "<p><strong>Calcium Deficiency</strong></p>\n<p><strong>S & 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 foods. Broccoli, cabbage and okra, Soya beans, Nuts, Flour, 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 & 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 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 & 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 foods. Broccoli, cabbage and okra, Soya beans.<br /> Nuts. Flour. Fish</p>",
"isNormal": false
},
{
"_id": "5ea99ae6fc48d036e083ec8a",
"name": "Calcium",
"valueTo": -76,
"valueFrom": -100,
"treatmentDescription": "insufficiency",
"recommendation": "<p><strong>Calcium Insufficiency</strong> <br /><strong>S & 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 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 & 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
},
解析PDF
{
_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上的每个数组中获取“名称”和“值”,检查“值”位于PrescriptionSetup中的“ valueFrom ”和“ valueTo ”之间的位置并更新“详细信息” ” 带有“描述”和“推荐”。
这就是我所做的。 我创建了一个突变:
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);
}
}),
更新报告方法
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 集合中有很多 Arrays,其中有很多项目。 我认为由于大量的数据库查询,我无法使其工作。 解决此问题的最佳方法是什么。
谢谢您的帮助
我会建议一种代码更改最少的方法。
const pp = PrescriptionSetup.find
这里pp
是Promise
,所以newRep
将是Promise
的数组
而不是[...newRep]
使用[...await Promise.all(newRep)]
await Object.keys(pdf).forEach((key) =>...)
这里.forEach
不返回任何内容,实际上您不必await
,但我们只是在 (1.) 中添加了一个异步逻辑,所以我们必须处理
更改为await Promise.map(Object.keys(pdf), async (key) =>...)
如果您使用bluebird
,否则使用与 Promise.map 等效的东西
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.