node Mongodb 修改数据库返回的值
需求:
获取”topic”表的数据,再根据话题id查询“article表”中对应话题的文章的数量
文章目录
- 初始写法
- 问题分析
- 解决方案
- 完整代码
- 总结
- 其他文件
初始写法
- 看pushArticleNum 中的
********************重点
部分:会发现我虽然赋值了,单独打印articleNum
也是有值的,但是打印一整个对象里面并没有新增articleNum
的键值对
const topicDao = require('../dao/crud/topicDao')(文章末尾附上)
const articleDao = require('../dao/crud/articleDao')(文章末尾附上)
const { errorTem, successTem } = require('./tools')(文章末尾附上)
// 获取列表(分页)
exports.getList = async function (req, res) {
try {
//请求分页数据(queryPage函数文章末尾附上)
const result = await topicDao.queryPage({ ...req.query });
//添加话题对应的文章数
const newRecords = await pushArticleNum(result.records);
//替换掉列表数据内容
result.records = newRecords;
//返回数据(successTem函数文章末尾附上)
res.send(successTem('查询成功', result))
} catch (error) {
//(errorTem函数文章末尾附上)
res.send(errorTem('查询失败', error))
}
}
// 添加主题对应的文章数
const pushArticleNum = (arr) => {
return new Promise(async (resolve, reject) => {
try {
const arrNew = [...arr];
for (let index = 0; index < arr.length; index++) {
const e = arr[index];
//获取文章数(getNum函数文章末尾附上)
const articleNum = await articleDao.getNum({ topicId: e.topicId });
//************重点************************
//将值赋值给每一项的对象
arrNew[index].articleNum = articleNum;
console.log(e.topicId, arrNew[index].articleNum, arrNew[index])
/***打印结果:topic-1680376778555 , 1, {
_id: new ObjectId("642883caea8281f470738ac6"),
topicId: 'topic-1680376778555',
title: '11111',
introduce: '2222',
createTime: '2023/4/2 上午3:19:38',
__v: 0
}
**/
//************重点************************
if (index == arr.length - 1) {
//返回修改后的数组
resolve(arrNew);
}
}
} catch (error) {
reject(error);
}
})
}
问题分析
- 试了好久,都没什么效果,就想着要不直接再重新造一个数组
- 然后就试出问题来了,打印出来的对象里面多了
$__
,$isNew
,_doc
的key值, 而列表数据被放在_doc
中,和我手动赋值进去的articleNum
并不在同一个数据层级中 - 悟了悟了:只需要把
_doc
放到新造的数组中就好了,不能直接把一整个对象值赋值进去
//for循环外定义空数组
const arrNew = [];
//圈重点部分
const articleNum = await articleDao.getNum({ topicId: e.topicId });
arrNew[index] = {...e, articleNum }
console.log(e.topicId,arr[index].articleNum, arr[index])
/***打印结果 topic-1680376778555, 2, {
'$__': InternalCache { activePaths: [StateMachine], skipId: true },
'$isNew': false,
_doc: {
_id: new ObjectId("642883caea8281f470738ac6"),
topicId: 'topic-1680376778555',
title: '11111',
introduce: '2222',
createTime: '2023/4/2 上午3:19:38',
__v: 0
},
articleNum: 2
}
]
**/
解决方案
//for循环外定义空数组
const arrNew = [];
//圈重点部分
const articleNum = await articleDao.getNum({ topicId: e.topicId });
arrNew[index] = {...e._doc, articleNum }
完整代码
const topicDao = require('../dao/crud/topicDao')(文章末尾附上)
const articleDao = require('../dao/crud/articleDao')(文章末尾附上)
const { errorTem, successTem } = require('./tools')(文章末尾附上)
// 获取列表(分页)
exports.getList = async function (req, res) {
try {
//请求分页数据(queryPage函数文章末尾附上)
const result = await topicDao.queryPage({ ...req.query });
//添加话题对应的文章数
const newRecords = await pushArticleNum(result.records);
//替换掉列表数据内容
result.records = newRecords;
//返回数据(successTem函数文章末尾附上)
res.send(successTem('查询成功', result))
} catch (error) {
//(errorTem函数文章末尾附上)
res.send(errorTem('查询失败', error))
}
}
// 添加主题对应的文章数
const pushArticleNum = (arr) => {
return new Promise(async (resolve, reject) => {
try {
const arrNew = [];
for (let index = 0; index < arr.length; index++) {
const e = arr[index];
//获取文章数(getNum函数文章末尾附上)
const articleNum = await articleDao.getNum({ topicId: e.topicId });
//************重点************************
//将值赋值给每一项的对象
arrNew[index] = {...e._doc, articleNum }
//************重点************************
if (index == arr.length - 1) {
//返回修改后的数组
resolve(arrNew);
}
}
} catch (error) {
reject(error);
}
})
}
总结
mongodb数据库返回的值并不是单纯的列表数据,而是在每一项列表值中的
_doc
对象中,如果需要处理数组值的话,需要将_doc
对象值取出再操作
其他文件
采用模块化开发,具体介绍在之前的文章中:node mongodb 写接口part
//'../dao/crud/topicDao'
//1.导入配置文件
var Mongoose = require('mongoose');
//2.导入Schema
const Schema = Mongoose.Schema
//3.定义Schema:要和数据库中的集合对应(Schema属性对象集合中的键)
const TopicSchema = new Schema({
topicId: { type: String, unique: true },
title: { type: String, unique: true },
introduce: { type: String },
createTime: { type: String },
createUserName: { type: String },
createUserId: { type: String },
})
//5.导出model,可以使用model操作数据库(表名(要大写,报错末尾+s),schema名,集合名)
//module.exports = Mongoose.model('Topic', TopicSchema)
const TopicModel = Mongoose.model('Topic', TopicSchema)
// 查 分页
exports.queryPage = async function (data) {
return new Promise((resolve, reject) => {
const { current, size } = data;
const param = regFn(['title', 'createUserName'], data, 'regex')
console.log('查询', param)
TopicModel.find(param).then(datas => {
TopicModel.find(param).limit(size).skip(size * (current - 1)).then((data) => {
resolve({
total: datas.length,
current: current,
size: size,
records: data
})
}).catch(e => {
console.log(e)
reject(e)
})
}).catch(e => {
console.log(e)
reject(e)
})
})
}
// 请求参数
exports.regFn = (arr, dataObj, type) => {
const data = {}
arr.forEach(key => {
if (!dataObj[key]) return
data[key] = dataObj[key]
if(type == 'regex'){
data[key] = new RegExp(dataObj[key])
}
});
return data
}
//'../dao/crud/articleDao'
//1.导入配置文件
const { Binary } = require('mongodb');
var Mongoose = require('mongoose');
//2.导入Schema
const Schema = Mongoose.Schema
//3.定义Schema:要和数据库中的集合对应(Schema属性对象集合中的键)
const articleSchema = new Schema({
articleId: { type: String, unique: true },
createTime: { type: String },
title: { type: String },
htmlContent: { type: String },
createUserId: { type: String },
createUserName: { type: String },
introduce: { type: String },
textContent: { type: String },
topicId: { type: String },
img: { type: Buffer },
})
//5.导出model,可以使用model操作数据库(表名(要大写,报错末尾+s),schema名,集合名)
//module.exports = Mongoose.model('article', articleSchema)
const ArticleModel = Mongoose.model('article', articleSchema)
// 获取个数
exports.getNum = async function (data) {
return await ArticleModel.count(data)
}
//tools.js
// 失败后的模板
exports.errorTem = (msg, error) => ({
code: 500,
msg,
error
});
// 查詢成功后数据返回的模板
exports.successTem = (msg, data) => ({
code: 200,
msg,
data
})