当前位置: 首页 > article >正文

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
})

http://www.kler.cn/a/6366.html

相关文章:

  • 基于Spring Boot的工商局商家管理系统
  • React第十八节 useEffect 用法使用技巧注意事项详解
  • 基于ceres优化的3d激光雷达开源算法
  • 《三角洲行动》游戏运行时提示“缺失kernel32.dll”:问题解析与解决方案
  • Java 中压缩图片并应用 EXIF 旋转信息
  • idea2024创建JavaWeb项目以及配置Tomcat详解
  • HulaCWMS呼啦企业网站管理系统 v3.0.4
  • 洛谷 P1135 奇怪的电梯 题解
  • C 数据类型
  • vscode设置选中代码自定义高亮颜色
  • 4个令人惊艳的ChatGPT项目,开源了!AIGC也太猛了...
  • 蓝桥杯-作物杂交(C++)
  • 【vue2.0后台项目之登陆】01登陆开发流程分析
  • Codeforces div 863C
  • C++ unordered_map容器所有的函数使用方法
  • 【Ruby学习笔记】6.Ruby 注释及判断
  • 剑指 Offer 56 - I. 数组中数字出现的次数
  • Android物理按键事件处理
  • springboot 数据库应用
  • .NET Core 中实现分布式事务的几种方案
  • 理想汽车的雷达在无人陵园内看到鬼?网友:按一下喇叭看会不会聚过来!
  • 基于SpringBoot开发的人事管理系统
  • Python 高级编程(文件操作)
  • TCP / IP 模型
  • AtCoder Beginner Contest 296 (A~D)
  • 虚拟机与主机互传文件