node + koa2 + mongodb 寫了一個給前端的接口前端
若是不是寫這個接口,這輩子都發現不了mongodb裏這個大坑
mongoose 是個ODM(Object Document Mapper),mongodb是nosql數據庫,文檔存儲 mysql,sqlserver,oracle都是關係型數據庫
因此mongodb沒法在取到對象增長屬性,必須在追加時候從新用一個對象,或者在schema中添加這個對象的keynode
// 這裏用來建數據庫表結構相關的 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 };
這裏寫前端接口,採用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; } });
這樣查出來的接口格式是這樣的mysql
可是對於前端來講,須要的接口是category和content對應起來的,也就是指望想要以下的樣子sql
其實並不難,就是在category每一個對象後面增長一個數組而已,咱們可能想就是這樣mongodb
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] }); }