我尝试使用NodeJS,MongoDB和Express创建电子书。到目前为止,我可以将所有章节显示为简单列表,如图1所示。显然,电子书也应该是子章节,所以我希望能够点击第1章并查看子章节,如图2所示。
我的问题是:如何创建这些子章节?数据库应该如何?如何操纵所有数据?如何正确显示?
P.S。我已经在MongoDB网站上看过用例,但它对我没有帮助。
代码片段(ebook.js模型,ebookmain.pug视图,app.js路由):
模型
const mongoose = require('mongoose')
let Schema = mongoose.Schema
//ebook schema
let ebookSchema = new Schema({
title: String,
body: String
})
// ebook model
let Ebook = mongoose.model('Ebook', ebookSchema)
module.exports = Ebook
视图
extends layout
block content
h1.page-header #{title}
ul.list-group
each ebook, i in ebookpages
li.list-group-item
a.newsLinks(href='/ebookpages/' + ebook._id)= ebook.title
路线
app.get('/ebookmain', (req, res) =>
Ebook.find({}, (err, ebookpages) => {
if (err) {
console.log(err)
} else {
res.render('ebookmain', {title: 'Ebook', ebookpages})
}
}))
图。 1。
图。 2。
编辑。
如何添加/编辑子章节?
当我有子章节的子章节时该怎么办?
添加新章节的代码片段(routes / ebookpages.js):
// add route
router.get('/add', (req, res) =>
res.render('add_ebook', {title: 'Add content'}))
// add submit post route
router.post('/add', (req, res) => {
let ebook = new Ebook()
ebook.title = req.body.title
ebook.body = req.body.body
ebook.save(err => {
if (err) {
console.log(err)
return
} else {
res.redirect('/ebookmain')
}
})
})
答案 0 :(得分:1)
您需要更改架构并添加一系列对象,这些对象将包含子章节的详细信息和内容
//ebook.js
let ebookSchema = new Schema({
title: String,
body: String,
subChapters:[{
name: String,
content: String,
}]
});
let Ebook = mongoose.model('Ebook', ebookSchema)
module.exports = Ebook
路线
//app.js
app.get('/ebookmain', (req, res) =>
Ebook.find({}, (err, ebookpages) => {
if (err) {
console.log(err)
} else {
res.render('ebookmain', {title: 'Ebook', ebookpages})
}
}));
这是您的观看文件。获取下拉使用css
//- ebookmain.pug
extends layout
block content
h1.page-header #{title}
ul.list-group
each ebook, i in ebookpages
li.list-group-item
a.newsLinks(href='/ebookpages/' + ebook._id)= ebook.title
if ebookpages.subChapters.length
ul
each subChap in ebookpages.subChapters
li.list-group-item
a.newSubChp(href='/ebookpages/'+ebook._id+'/'+subChap.name) = subChap.name
然后你只需要从数组中获取数据。 :)希望这有帮助
答案 1 :(得分:1)
let ebookSchema = new Schema({
title: String,
body: String,
subChapters:[{
name: String,
content: String,
}]
});
假设你在集合中有这样的东西
[{
_id: '1',
title: 'book 1',
body: '.....',
subChapters[]
},{
_id: '2'
title: book 2'
body: '....',
subChapters: [{
name: 'sub-1',
content: '....'}]
}]
// app.js
const EB = require('./ebook.js');
//Let's say you need to add something to the array i.e subChapters.
var obj = { name: 'sub1', content:'......'};
EB.update({_id: '1'},{ $push: { subChapters: obj } }, function(err, info){
if(err) throw err;
console.log(info);
});
这是你一次只添加一个子章节的时候。
假设您要添加多个subChapters,那么您将使用$each
个文档:https://docs.mongodb.com/manual/reference/operator/update/push/
使用$pull
从阵列文档中删除:https://docs.mongodb.com/manual/reference/operator/update/pull/
要在特定位置插入内容,请检查我的答案 https://stackoverflow.com/a/47966974/8380606
希望这有帮助。
答案 2 :(得分:0)
您的架构结构如下所示:
let ebookSchema = new Schema({
title: String,
body: String,
subchpaters:[{
name: String,
content: String,
}]
})
Ebook.find({title:'example'}, (err, ebookpages) => {
if (err) {
console.log(err)
} else if(ebookpages) {
Ebook.find({"subchpaters.name","subchpaters.content"}, (err, doc) => {
if(err) {
console.log("error",err);
} else {
console.log("doc",doc);
}
}