node + koa2 + mongodb 写了一个给前端的接口

如果不是写这个接口,这辈子都发现不了mongodb里这个大坑

mongoose 是个ODM(Object Document Mapper),mongodb是nosql数据库,文档存储 mysql,sqlserver,oracle都是关系型数据库

所以mongodb无法在取到对象增加属性,必须在追加时候重新用一个对象,或者在schema中添加这个对象的key

  • model.js
// 这里用来建数据库表结构相关的
const mongoose = require('mongoose'); mongoose.connect('mongodb://127.0.0.1:27017/zhongtong', {
useNewUrlParser: true
}); // 连接数据库 let categorySchema = new mongoose.Schema({
name: String
}),
categoryModel = mongoose.model('category', categorySchema), // 分类
contentSchema = new mongoose.Schema({
name: String,
poster: String,
source: String,
addTime: Date,
checkFirst: Boolean,
checkSecond: Boolean,
checkThird: Boolean,
categoryId: String
}),
contentModel = mongoose.model('content', contentSchema), // 内容
bannerSchema = new mongoose.Schema({
src: String,
categoryId: String,
type: Number
}),
bannerModel = mongoose.model('banner', bannerSchema); // 轮播图banner module.exports = {
categoryModel,
contentModel,
bannerModel
};
  • index.js
这里写前端接口,采用post请求
const router = require('koa-router')(), // 路由
globalVariable = require('../config/variable'), // 状态码
model = require('../model/model'), // 模型
categoryModel = model.categoryModel, // 分类
contentModel = model.contentModel, // 内容
bannerModel = model.bannerModel, // banner
VARIABLE = globalVariable.VARIABLE, // 状态码
STATUS = globalVariable.STATUS; // 状态格式 router.prefix('/zt'); // 首页接口
router.post('/home', async (ctx, next) => {
try {
let category = await categoryModel.find(), // 类型
categoryId = category.map(value => {
return value.id;
}),
banner = await bannerModel.find(),
arr = [],
list = []; for (let i = 0; i < categoryId.length; i++) {
await contentModel
.find({ categoryId: categoryId[i] })
.limit(10)
.then(v => {
arr.push(v);
});
} ctx.body = {
code: VARIABLE.SUCCESS_CODE,
msg: VARIABLE.SUCCESS_MSG,
data: {
banner: banner,
category: category,
contentList: list
}
};
} catch (err) {
ctx.body = STATUS.ERROR;
}
});

这样查出来的接口格式是这样的

但是对于前端来说,需要的接口是category和content对应起来的,也就是期望想要如下的样子

其实并不难,就是在category每个对象后面增加一个数组而已,我们可能想就是这样

  • index.js
let list = []; // 这个就是组成后的数组
for (let i = 0; i < categoryId.length; i++) {
list[i]['content'] = arr[i]; // arr就是上面代码里的查出content表的内容
}

但是你会发现,直接输出list永远都是没有content属性的一个数组,但是如果直接list.contegt 就有里面arr的值,简直无语。。。

这也就是mongodb的一个问题

  • 第一种解决方法
在category表里增加一个字段content,但是如果这个让dba看到了肯定一顿吐槽,这个表结构也太不专业了吧。而且这就是数据库的冗余字段啊
  • 第二种解决办法
// index.js
// 把category里的数据放到一个新的数组,并且数组里追加的对象新建一个key
for (let i = 0; i < category.length; i++) {
/*
* 坑!!
* 如果不是写这个接口,这辈子都发现不了mongodb里这个大坑,哼,研究了宝宝好久
* mongoose 是个ODM(Object Document Mapper),mongodb是nosql数据库,文档存储
* mysql,sqlserver,oracle都是关系型数据库,
* 所以mongodb无法在取到对象增加属性,必须在追加时候重新用一个对象,或者在schema中添加这个对象的key
* 如果可以增加对象,直接遍历category数组,增加一个content。但是现在需要从新赋值一个id,name,content
*/
list.push({
_id: category[i]._id,
name: category[i].name,
content: arr[i]
});
}
  • 第三种解决办法

    lean属性的作用:转换mongoose查询结果类型,从MongooseDocuments转换为JS Object,从而便于我们修改查询结果。``
let category = await categoryModel.find().lean()

mongodb用mongoose查库的对象,不能增加属性的更多相关文章

  1. mongodb用mongoose得到的对象不能增加属性解决

    一,先定义了一个goods(商品)的models var mongoose = require('mongoose'); var Schema = mongoose.Schema; var produ ...

  2. mongodb用mongoose取到的对象不能增加属性

    先定义了一个article的schema var mongoose = require('mongoose'); var Schema = mongoose.Schema; exports.schem ...

  3. php 给对象动态增加属性 及子类继承父类的构造方法

    <?php error_reporting(-1); ini_set('display_errors','on'); class A { public $a = 'hello'; public  ...

  4. 前端笔记之NodeJS(四)MongoDB数据库&Mongoose&自制接口&MVC架构思想|实战

    一.MongoDB数据库 1.1 NoSQL简介 随着互联网web2.0网站的兴起,传统的SQL数据库(关系数据库)在应付web2.0网站,特别是超大规模和高并发的SNS(social network ...

  5. mongoDB (mongoose、增删改查、聚合、索引、连接、备份与恢复、监控等等)

    MongoDB - 简介 官网:https://www.mongodb.com/ MongoDB 是一个基于分布式文件存储的数据库,由 C++ 语言编写,旨在为 WEB 应用提供可扩展的高性能数据存储 ...

  6. MongoDB 和 Mongoose 04

    一.安装 1. 相关 https://www.mongodb.org/dl/win32/ MongoDB的版本偶数版本为稳定版,奇数版本为开发版 MongoDB对于32位系统支持不佳,所以3.2版本以 ...

  7. [转] mongoDB与mongoose

    mongoDB简介 mongoDB与一些关系型数据库相比,它更显得轻巧.灵活,非常适合在数据规模很大.事务性不强的场合下使用.同时它也是一个对象数据库,没有表.行等概念,也没有固定的模式和结构,所有的 ...

  8. Practical Node.js (2018版) 第5章:数据库 使用MongoDB和Mongoose,或者node.js的native驱动。

    Persistence with MongoDB and Mongoose https://github.com/azat-co/practicalnode/blob/master/chapter5/ ...

  9. Node.js开发——MongoDB与Mongoose

    为了保存网站的用户数据和业务数据,通常需要一个数据库.MongoDB和Node.js特别般配,因为MongoDB是基于文档的非关系型数据库,文档是按BSON(JSON的轻量化二进制格式)存储的,增删改 ...

随机推荐

  1. Spring Mvc Web 配置拦截规则与访问静态资源 (三)

    拦截规则配置 1. *.do <!-- Processes application requests --> <servlet> <servlet-name>app ...

  2. BZOJ2428 均分数据

    2428: [HAOI2006]均分数据 Time Limit: 5 Sec  Memory Limit: 128 MB Description 已知N个正整数:A1.A2.…….An .今要将它们分 ...

  3. 利用iis虚拟目录实现文件服务器功能

    要求说明: 通过网站上传文件保存到统一的文件服务器上. 服务器说明: 1.文件服务器以下称为FilesServer,IP地址为:192.168.1.213 2.Web服务器为以下称为WebServer ...

  4. Servlet笔记11--补充

    Servlet线程安全问题: 代码示例: package com.bjpowernode.javaweb.servlet; import java.io.IOException; import jav ...

  5. arm交叉编译器gnueabi、none-eabi、arm-eabi、gnueabihf等的区别【转】

    转自:https://www.cnblogs.com/deng-tao/p/6432578.html 博客来之于:  http://www.veryarm.com/296.html 交叉编译工具链的命 ...

  6. win7下iis中配置php.ini文件

    将php.ini-development配置文件重命名为php.ini配置文件即可. 接着做如下配置操作: 1.修改php.ini配置文件 打开php.ini配置文件,找到 12 ; On windo ...

  7. tomcat -> 简介&部署

    Tomcat 简介 Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache.Sun和其他一些公司及个人共同开 ...

  8. 启动虚拟机报错VMware Workstation cannot connect to the virtual machine

    启动虚拟机报错: VMware Workstation cannot connect to the virtual machine. Make sure you have rights to run ...

  9. LeetCode(14):最长公共前缀

    Easy! 题目描述: 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower",&qu ...

  10. 解决连不上dl.google.com和dl-ssl.google.com

    http://ping.chinaz.com/ 开发android遇到的最大问题就是Google被墙了,而我们的sdk又需要通过dl.google.com和dl-ssl.google.com去下载一些 ...