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

原文地址:https://www.cnblogs.com/luxiaoyao/p/10552905.html

时间: 2024-08-29 16:05:02

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

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

一,先定义了一个goods(商品)的models var mongoose = require('mongoose'); var Schema = mongoose.Schema; var productSchema = new Schema({ "productId":String, "producName": String, "salePrice":Number, "productImage":String }); mod

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

先定义了一个article的schema var mongoose = require('mongoose'); var Schema = mongoose.Schema; exports.schema = new Schema({ title: String,//标题 description: String,//描述 content: String,//内容 status:{type: Number, defalut: 0}, //未发布:0 ,发布:1 create_at: {type: D

php 给对象动态增加属性

<?php error_reporting(-1); ini_set('display_errors','on'); class A { public $a = 'hello'; public function add() { $this->b = 'world'; }- public static function p() { echo 'world',PHP_EOL; }- } $a = new A; $a->add(); $a->c = 'test'; $a->p();

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

MongoDB - 简介 官网:https://www.mongodb.com/ MongoDB 是一个基于分布式文件存储的数据库,由 C++ 语言编写,旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. MongoDB - 安装及运行 下载 07/05/2017 Current Stable Release (3.4.6) https://www.mongodb.com/dow

Node.js开发入门——MongoDB与Mongoose

为了保存网站的用户数据和业务数据,通常需要一个数据库.MongoDB和Node.js特别般配,因为MongoDB是基于文档的非关系型数据库,文档是按BSON(JSON的轻量化二进制格式)存储的,增删改查等管理数据库的命令和JavaScript语法很像.如果你在Node.js里访问MongoDB的数据,会有我们是一家人的感觉,特别亲切. 我也准备使用MongoDB来作为我的数据库. MongoDB使用集合(collection)和文档(document)来描述和存储数据,collection就相当

初学mongodb和mongoose

进入安装mongodb的文件夹下的bin文件夹,执行命令:mongo ,就可以使用mongodb了. 安装好mongoose后,在app.js中,首先引入mongoose这个模块: var mongoose = require('mongoose'); //连接到对应的数据库: //端口号默认链接27017: //test是数据库的名称,mongodb不需要建立数据库,当你需要连接的数据库不存在时,会自动创建一个: mongoose.connect('mongodb://localhost/te

[转] mongoDB与mongoose

mongoDB简介 mongoDB与一些关系型数据库相比,它更显得轻巧.灵活,非常适合在数据规模很大.事务性不强的场合下使用.同时它也是一个对象数据库,没有表.行等概念,也没有固定的模式和结构,所有的数据以文档的形式存储. ·由c++语言编写,是一个分布式文件存储的开源NoSQL数据库系统.在高负载的情况下,添加更多的节点,可以保证服务器性能. · mongoDB旨在为web应用提供可扩展的高性能数据存储解决方案 · mongoDB将数据存储为一个文档,数据结构由键值对组成.mongoDB文档类

前端知识点回顾——mongodb和mongoose模块

mongodb和mongoose模块 数据库 数据库有关系型数据库(MySQL)和非关系型数据库(mongodb),两者的语法和数据存储形式不一样. mySQL 关系型数据库 类似于表格的形式,每一条数据都是以id为标识 table thead name sex age id tbody May female 18 1 Simple male 25 2 mongodb 非关系型数据库 集合,相当于表的概念,Bson,一条数据代表一个文档(数据的基本单位) { id : name : May ag

【重学Node.js 第3篇】mongodb以及mongoose的使用

mongodb以及mongoose的使用 本篇为这个系列的第三篇,想看更多可以直接去github的项目:https://github.com/hellozhangran/happy-egg-server 更多介绍可以看:https://www.cnblogs.com/zhangran/p/11963616.html mongodb mongodb是典型的非关系型数据库,关于它的背景介绍和优势劣势这里就不赘述,我们直接讲实操或者说最有可能用到的部分. mongodb常用指令 mongod --co