关于node操作mongodb的二三事

      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/

猜你喜欢

转载自george-tan.iteye.com/blog/2317205
今日推荐