Mongodb是nosql中的翘楚,所以我的毕设就赶了一把潮流,用mongodb狠狠的在到是面前装了一下。结果结果导师说你这抄的太明显了 ╮(╯_╰)╭。
由于mongodb中无主键概念,所有记录其都给生成 _id为唯一标示,集合取代了表。刚开始我还是用mysql思维去思考结果被项目组长训斥说不能快速接受新鲜事物。
既然没了主键概念那外键也不幸免,没了外键与主键(其实mongo也有一些方法来实现这些sql特性)对于俩张表以上的联合操作,在当时真的让我很无奈。且node是异步稍不注意,代码就成了回调深渊,要多深有多深。。。
不过对于node中的异步操作有多种方式解决,导包、promise等,promise大家可以根据简书上的教程去学习,语言简练且不缺乏段子,总之你看了会受益匪浅。在这里我给大家推荐async包,具体实例大家可以去github上根据demo练习。
我只贴出我所用到的map流:
mongoClient.connect(setting.dbInfo, function (err, db) { var teacher = db.collection('teacher'); teacher.find({course:{$exists:true}}).toArray(function (err, teacherDoc) { if (err) { console.log('error if ------>') res.status('500'); res.json({ result: 'ERROR_1', resson: '#_1 System error! ' }); } if (teacherDoc.length > 0) { res.status('200'); async.map(teacherDoc, function (itemT, callbackT) { async.map(itemT.course, function (itemC, callbackC) { var course = db.collection('course'); course.find({'name': itemC}).toArray(function (err, courseDoc) { if (err) { callbackC(err, null) } else { courseDoc[0].teacherName = itemT.name; courseDoc[0].teacherTel = itemT.tel_phone; courseDoc[0].teacherEdu = itemT.edu_level; courseDoc[0].teacherSex = itemT.sex; courseDoc[0].teacherAge = itemT.age; callbackC(null, courseDoc[0]); } }); }, function (errc, resultC) { if (errc) { console.log(errc); } else { callbackT(null, resultC) } }) }, function (errr, resultT) { if (errr) { console.log(errr); } else { res.json({ result: 'OK', teaAll: _.flatten(resultT) }); db.close(); } }); } else { res.status('200'); res.json({ result: 'ERROR_2', resson: '#_2 Not exit!' }) } }); });
async的git地址:https://github.com/caolan/async/