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的轻量化二进制格式)存储的,增删改 ...
随机推荐
- Spring Mvc Web 配置拦截规则与访问静态资源 (三)
拦截规则配置 1. *.do <!-- Processes application requests --> <servlet> <servlet-name>app ...
- BZOJ2428 均分数据
2428: [HAOI2006]均分数据 Time Limit: 5 Sec Memory Limit: 128 MB Description 已知N个正整数:A1.A2.…….An .今要将它们分 ...
- 利用iis虚拟目录实现文件服务器功能
要求说明: 通过网站上传文件保存到统一的文件服务器上. 服务器说明: 1.文件服务器以下称为FilesServer,IP地址为:192.168.1.213 2.Web服务器为以下称为WebServer ...
- Servlet笔记11--补充
Servlet线程安全问题: 代码示例: package com.bjpowernode.javaweb.servlet; import java.io.IOException; import jav ...
- arm交叉编译器gnueabi、none-eabi、arm-eabi、gnueabihf等的区别【转】
转自:https://www.cnblogs.com/deng-tao/p/6432578.html 博客来之于: http://www.veryarm.com/296.html 交叉编译工具链的命 ...
- win7下iis中配置php.ini文件
将php.ini-development配置文件重命名为php.ini配置文件即可. 接着做如下配置操作: 1.修改php.ini配置文件 打开php.ini配置文件,找到 12 ; On windo ...
- tomcat -> 简介&部署
Tomcat 简介 Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache.Sun和其他一些公司及个人共同开 ...
- 启动虚拟机报错VMware Workstation cannot connect to the virtual machine
启动虚拟机报错: VMware Workstation cannot connect to the virtual machine. Make sure you have rights to run ...
- LeetCode(14):最长公共前缀
Easy! 题目描述: 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower",&qu ...
- 解决连不上dl.google.com和dl-ssl.google.com
http://ping.chinaz.com/ 开发android遇到的最大问题就是Google被墙了,而我们的sdk又需要通过dl.google.com和dl-ssl.google.com去下载一些 ...