无法从graphql突变更新mongodb集合
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法从graphql突变更新mongodb集合相关的知识,希望对你有一定的参考价值。
我无法解决以下问题。我想用NodeJS,Apollo和Mongoose开发GraphQL服务器。
下面是数据库中的一些示例数据:
PrescriptionSetup
{
"_id": "5ea99ae6fc48d036e083ec20",
"name": "Calcium",
"valueTo": -51,
"valueFrom": -75,
"treatmentDescription": "Deficiency",
"recommendation": "<p><strong>Calcium Deficiency</strong></p>
<p><strong>S & S include: </strong></p>
<p>Anxiety, Muscle cramps, and spasms, Bruising, Nervousness, Insomnia, Osteoporosis, Tooth decay</p>
<p><strong>Calcium sources:</strong></p>
<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>
<p><strong>S & S include:</strong></p>
<p>Arthritis, Gall stones, Constipation, Kidney stones, Depression, Mental, Fatigue.</p>
<p><strong>Calcium sources:</strong></p>
<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>
<p><strong>S & S include: </strong></p>
<p>Fatigue.Weak and brittle fingernails.Poor appetite. Muscle cramps, stiffness, and spasms.</p>
<p><strong>Calcium sources:</strong></p>
<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>
<p>Anxiety, Muscle cramps and spasms, Bruising, Nervousness, Insomnia, Osteoporosis, Tooth decay</p>
<p><strong>Calcium sources:</strong></p>
<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>
<p><strong>S & S include:</strong></p>
<p>Confusion, Fatigue, Depression, Low blood pressure, Diarrhea, Muscle weakness</p>
<p><strong>Magnesium sources:</strong></p>
<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的每个数组中分别获取“ name”和“ value”,检查“ value”在哪里在PrescriptionSetup的“ valueFrom”和“ valueTo”之间,并用“ description”和“ recommendation”更新“ detail” “。
这就是我所做的。我创建了一个突变:
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集合内有很多数组,其中有很多项目。我认为由于巨大的数据库查询,我无法使其工作。解决此问题的最佳方法是什么。
感谢您的帮助
我将建议一种代码更改最少的方法。
[
const pp = PrescriptionSetup.find
在这里pp
是Promise
,所以newRep
将是Promise
s的数组而不是
[...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等效的东西
以上是关于无法从graphql突变更新mongodb集合的主要内容,如果未能解决你的问题,请参考以下文章
Express-graphql“在运行突变和查询时无法使用 mongodb 读取未定义的属性‘集合’”
如何进行更新突变 - GraphQL(加上 mongoDB)