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!'
})
}
});
});
这里只是抛砖引玉,给初学者提供一个思路,大家还是多研究下官方api,照着api学习是极好的。