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的轻量化二进制格式)存储的,增删改 ...
随机推荐
- Oozie 生成JMS消息并向 JMS Provider发送消息过程分析
一,涉及到的工程 从官网下载源码,mvn 编译成 Eclipse工程文件:
- ASP.NET MVC学习(一)之路由篇Route
什么是路由 通过[路由]配置,路由可以规定URL的特殊格式,使其达到特殊效果. 在ASP.NET MVC框架中,通过路由配置URL,使用户的URL请求可以映射到Controller下的action方法 ...
- 200行代码实现RPC框架
之前因为项目需要,基于zookeeper和thrift协议实现了一个简单易用的RPC框架,核心代码不超过200行. zookeeper主要作用是服务发现,thrift协议作为通信传输协议, 基于com ...
- HDU 2086 A=? 数学题
题目描述:有一个公式,Ai = (Ai-1 + Ai+1)/2 - Ci (i = 1, 2, 3, .... n).,如果给出A0, An+1, 和 C1, C2, .....Cn要你计算出A1是多 ...
- 基于滑动窗口协议写的程序(UDP实现) .
正好有一个大作业关于用socket实现滑动窗口协议,所以写了一个,模拟接收方与发送方窗口都是2,用两个线程实现. 下面是代码,注释的比较详细了. socket_udp.h #include<st ...
- flask基础之LocalProxy代理对象(八)
前言 flask框架自带的代理对象有四个,分别是request,session,g和current_app,各自的含义我们在前面已经详细分析过.使用代理而不是显式的对象的主要目的在于这四个对象使用太过 ...
- Mysql导入脚本失败,提示需要SUPER权限
1.删除: /*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ 2.查看增删函数有没有重复 3.删除: set GLOBAL log ...
- Visual Studio 2012“完美的拥抱”Visual Studio Online
看了Visual Studio 2012完美的拥抱GitHub 写的不错,不过,配置起来太麻烦.既然是使用VS编码,微软的东西嘛,当然还有更简单的,那就是Visual Studio Online.不用 ...
- makefile 中 foreach
四.foreach 函数 foreach函数和别的函数非常的不一样.因为这个函数是用来做循环用的,Makefile中的foreach函数几乎是仿照于Unix标准Shell(/bin/sh)中的for语 ...
- Java类的继承与多态特性-入门笔记
相信对于继承和多态的概念性我就不在怎么解释啦!不管你是.Net还是Java面向对象编程都是比不缺少一堂课~~Net如此Java亦也有同样的思想成分包含其中. 继承,多态,封装是Java面向对象的3大特 ...