mongodb用mongoose查库的对象,不能增加属性
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查库的对象,不能增加属性的更多相关文章
- mongodb用mongoose得到的对象不能增加属性解决
一,先定义了一个goods(商品)的models var mongoose = require('mongoose'); var Schema = mongoose.Schema; var produ ...
- mongodb用mongoose取到的对象不能增加属性
先定义了一个article的schema var mongoose = require('mongoose'); var Schema = mongoose.Schema; exports.schem ...
- php 给对象动态增加属性 及子类继承父类的构造方法
<?php error_reporting(-1); ini_set('display_errors','on'); class A { public $a = 'hello'; public ...
- 前端笔记之NodeJS(四)MongoDB数据库&Mongoose&自制接口&MVC架构思想|实战
一.MongoDB数据库 1.1 NoSQL简介 随着互联网web2.0网站的兴起,传统的SQL数据库(关系数据库)在应付web2.0网站,特别是超大规模和高并发的SNS(social network ...
- mongoDB (mongoose、增删改查、聚合、索引、连接、备份与恢复、监控等等)
MongoDB - 简介 官网:https://www.mongodb.com/ MongoDB 是一个基于分布式文件存储的数据库,由 C++ 语言编写,旨在为 WEB 应用提供可扩展的高性能数据存储 ...
- MongoDB 和 Mongoose 04
一.安装 1. 相关 https://www.mongodb.org/dl/win32/ MongoDB的版本偶数版本为稳定版,奇数版本为开发版 MongoDB对于32位系统支持不佳,所以3.2版本以 ...
- [转] mongoDB与mongoose
mongoDB简介 mongoDB与一些关系型数据库相比,它更显得轻巧.灵活,非常适合在数据规模很大.事务性不强的场合下使用.同时它也是一个对象数据库,没有表.行等概念,也没有固定的模式和结构,所有的 ...
- Practical Node.js (2018版) 第5章:数据库 使用MongoDB和Mongoose,或者node.js的native驱动。
Persistence with MongoDB and Mongoose https://github.com/azat-co/practicalnode/blob/master/chapter5/ ...
- Node.js开发——MongoDB与Mongoose
为了保存网站的用户数据和业务数据,通常需要一个数据库.MongoDB和Node.js特别般配,因为MongoDB是基于文档的非关系型数据库,文档是按BSON(JSON的轻量化二进制格式)存储的,增删改 ...
随机推荐
- 《翻译》PEP 380 – 委托子生成器语法
PEP 380 – 委托子生成器语法 翻译自: https://www.python.org/dev/peps/pep-0380/ 摘要 一项新的语法被提出了:生成器委托其部分操作给另一个生成器.委 ...
- 20155303 2016-2017-2 《Java程序设计》第五周学习总结
20155303 2016-2017-2 <Java程序设计>第五周学习总结 教材学习中的问题和解决过程 『问题一』:受检异常与非受检异常 『问题一解决』: 受检异常:这种在编译时被强制检 ...
- Tju_Oj_3988Password
这个题是给树的前序和中序,输出后序. 做法是根据前序找根,根据根在中序中找中序的左右子树,根据左右子树长度找前序的左右子树,依此递归. 做过之后感觉还是比较基础的,废话不多说,上题上代码. Bob w ...
- 什么是BS,BS和CS的区别有哪些
BS和CS的区别以及优缺点 C/S又称Client/Server或客户/服务器模式.服务器通常采用高性能的PC.工作站或小型机,并采用大型数据库系统,如Oracle.Sybase.Informix或 ...
- 【源码阅读】Mimikatz一键获取远程终端凭据与获取明文密码修改方法
1.前言 mimikatz框架是非常精妙的,粗浅讲一下修改的思路. 它的模块主要由各个结构体数组组成,根据传入的命令搜索执行相应命令的模块 mimikatz.c 部分代码: NTSTATUS mimi ...
- linux服务器账号密码正确无法登录
登录服务器时,发现密码错误,输入后还是错误不能登录 最后发现登录日志中有pam_tally2(sshd:auth): user root (0) tally 53, deny 6 less /var/ ...
- linux服务器如何添加sudo用户
1. 编辑 vi /etc/ssh/sshd_config 文件,修改默认端口:默认Port为22,并且已经注释掉了,修改是把注释去掉,并修改成其它的端口. 原来用默认端口:22修改为:8975 (这 ...
- mac安装ocr
mac安装Tesserocr 安装 Imagemagick 和 Tesseract 库: brew install imagemagick brew install tesseract --all-l ...
- yum安装软件报错:curl#6 - "Could not resolve host: mirrorlist.centos.org; Temporary failure in name resolut
# yum install -y epel-release Loaded plugins: fastestmirror Repository base is listed more than once ...
- java虚拟机规范(se8)——java虚拟机结构(二)
2.5 运行时数据区域 java虚拟机定义了多个用于程序执行期间的运行时数据区域.这些数据区域中一些随着java虚拟机的启动而创建,随着虚拟机的退出而销毁.其他的数据区域时和线程相关的.线程相关数据区 ...