I'm trying to create a help page for a website using mongodb and graphql. I've made this schema (joiGoose Schema) for the help pages:
constructor()
{
const joiSchema = joi.object
({
url: joi.string().required(),
title: joi.string().required(),
content: joi.string().required(),
children: joi.array().items
(
joi.string().meta({ _mongoose: { type: "ObjectId", ref: "Help" } }).optional(),
).meta({ _mongoose : { _id: false, timestamps: false } }),
published: joi.boolean().default(true).required(),
createdAt: joi.date().required().default(() => moment()),
updatedAt: joi.date().required().default(() => moment()),
});
const mongooseSchema = super(joigoose.convert(joiSchema));
return mongooseSchema;
}
The first thing I want to do is to give the summary of the help section. I get all the pages from mongodb using the following query :
const allHelpPages = await MONGO.Help.find();`
It gives me an array containing all the help pages. As each page can have multiple nested children pages (there is no maximum level), what I need is to reduce the array with the children for all the pages.
Example:
const allPages =
[
{
id: 1,
title: Test 1,
children:
[
2,
3
]
},
{
id: 2,
title: Test 2,
children:
[
4,
5
]
}
{
id: 3,
title: Test 3,
children:
[
6
]
}
{
id: 4,
title: Test 4
}
{
id: 5,
title: Test 5
}
{
id: 6,
title: Test 6,
children:
[
7
]
}
{
id: 7,
title: Test 7
}
]
Should end to :
[
{
id: 1,
title: Test 1,
children:
[
{
id: 2,
title: Test 2,
children:
[
{
id: 4,
title: Test 4
},
{
id: 5,
title: Test 5
}
]
},
{
id: 3,
title: Test 3,
children:
[
{
id: 6,
title: Test 6,
children:
[
{
id: 7,
title: Test 7
}
]
}
]
}
]
},
]
allPages. For each "page" iterate over thechildren. For each child get the corresponding entry inallPagesand replace the id inchildrenwith the "page". Remove the "page" fromallPages.id: 6becomes a child ofid: 3? Maybe clean up your Q code for two objects. Also, your Q is a little general and Confusing.