1. 程式人生 > >node.js+express+mongodb基礎..持續更新

node.js+express+mongodb基礎..持續更新

step 1.下載node.js

step 2.開啟你的cmd

執行命令 npm install -g express

express 4.x版本中將命令工具分出來了,需要再安裝一個命令工具,

執行命令“npm install -g express-generator

step 3.下載webstorm 

webstorm需要license,在網上找一個就可以了。

step.4下載webstorm之後

找到你nodejs的位置,version就是你express的version。

專案結構如下


step 5.下載mongodb

推薦下載那個zip格式,不要exe格式

step 6.下載robomongo,是mongodb視覺化工具

step 7 開啟mongodb

開啟你下載mongodb的路徑:C:\Users\TANGIV\Downloads\mongodb-win32-x86_64-2008plus-3.0.6\mongodb-win32-x86_64-2008plus-3.0.6\bin

C:\Users\TANGIV\Downloads\mongodb-win32-x86_64-2008plus-3.0.6\mongodb-win32-x86_64-2008plus-3.0.6\ 

路徑下新建資料夾\data\db

如下:

C:\Users\TANGIV\Downloads\mongodb-win32-x86_64-2008plus-3.0.6\mongodb-win32-x86_64-2008plus-3.0.6\data\db

開啟命令列輸入 

cd C:\Users\TANGIV\Downloads\mongodb-win32-x86_64-2008plus-3.0.6\mongodb-win32-x86_64-2008plus-3.0.6\bin

mongod --dbpath C:\Users\TANGIV\Downloads\mongodb-win32-x86_64-2008plus-3.0.6\mongodb-win32-x86_64-2008plus-3.0.6\data\db


出現提示連線到埠 27017即可

step 8 開啟robomongo 連線到該埠號就可以看到:


step 9下載mongodb模組

在命令列輸入:

npm install mongodb 

app.js

var express = require("express");
var app = express();
var path = require('path');

//bodyParser用於解析客戶端請求的body中的內容
var bodyParser = require('body-parser');

//路由頁面
var routes = require('./routes/index');

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

app.use(express.static(path.join(__dirname, 'public')));
app.use(routes);

module.exports = app;
關於bodyParser這個東西,我也不是特別理解,大家自己去找找資料吧!

index.js

var user =require('./users');
var teacher =require('./teachers');
var express = require('express');
var router = express.Router();


/* user Login verification*/
router.post('/',user.userLogin());

/* get all title */
router.post('/exam',teacher.getAllTitle());
這個檔案用來做路由的分發,所有的請求都會被接收到這個頁面,如果再通過不同的url呼叫不同的模組方法
這個語句是引用模組:
var user =require('./users');
var teacher =require('./teachers');

這裡的user就是一個模組,userLogin()是它裡面的一個方法

teacher也是一個模組,getAllTitle()是它裡面的一個方法

users.js(路徑:routes/users.js)

var userDao = require("../dao/userDao");
var mongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost:27017/E-PeopleSmart';
exports.userLogin = function() {
    return function(req, res) {
        var account = req.body.account;
        var password = req.body.password;

        console.log(account);
        console.log(password);

        var data = {account:account, password:password};

        console.log(data);

        mongoClient.connect(url, function(err, db) {

            console.log("Connected correctly to server");

            userDao.queryUser(db, data, function(result) {
                console.log(result);
                console.log(result.length);

                if(result.length != 0) {
                    res.setHeader('Content-Type', 'text/plain');
                    res.json({code:200, status:"success", users:result});
                } else {
                    res.setHeader('Content-Type', 'text/plain');
                    res.json({code:404, status:"fail"});
                }
                db.close();
            });
        });
    }
}
用到了mongoClient來連線資料庫,以上是一個簡單的登入驗證。
var account = req.body.account;
var password = req.body.password;
這裡接收了從移動Client傳來的引數,account和password都是你在客戶端定義的map的key值
exports.userLogin = function() {...
這句話大概可以理解為生成了一個方法
var userDao = require("../dao/userDao");
這裡引用了userDao模組,其路徑為:dao/userDao.js
userDao.queryUser(db, data, function(result) {...
這裡呼叫了userDao模組的queryUser方法,並且傳入db,data就是我們的查詢條件,function是一個回撥方法,這裡傳入的引數沒有固定,可以根據自己的需要傳遞。

userDao.js
exports.queryUser = function(db, data, callback) {
    var user = db.collection("user");
    user.find(data).toArray(function(err, result) {
        if(err) {
            console.log("Error : " + err);
            return;
        }

        callback(result);
    });
};
這裡是通過查詢條件找到是否存在該使用者,result是查詢結果,長度不為0的話,就說明存在該使用者。

以下是mongodb+nodejs查詢筆記:

有這樣結構的表:


(1)需要的結構是內嵌文件examsGroup的某些資料,而不需要resultGroup如:

[{"examsGroup":

[{"examId":159,"examName":"^100 test","score":0},

{"examId":168,"examName":"dghv","score":0},

{"examId":169,"examName":"123","score":-1}]}]

user.find({"userName": Id}, {"_id": 0,"examsGroup.examId":1,"examsGroup.examName": 1,"examsGroup.score": 1}).toArray(function (err, result) {
        if (!err) {

            callback(result);
        }
        else {
            console.log(err);
        }


    });

find(查詢條件,顯示條件).toArray(回撥方法)

顯示條件,想要顯示的值就設定為1,其餘沒有被設定為1的值都不會顯示,但是"_id"這個值除外,它需要手動設定為0

(2)需要內嵌文件examGroups的某一物件,就是圖中的examGroups下的0.1.2……等等

<span style="font-family:Arial;font-size:10px;"></span><pre name="code" class="javascript"><span style="font-family:Arial;font-size:10px;">user.find({"userName": userName,"examsGroup.examId":examId}, {"_id": 0,"examsGroup": 1}).toArray(function (err, result) {</span>
if (!err) { console.log(result); callback(result); } else { console.log(err); } 其中
user.find({"userName": userName,"examsGroup.examId":examId}....
useName:是定位到這個表的某一條資料,它可以查到如圖中這樣結構的一行資料,然後

examsGroup.examId:是定位到這一條資料它的examGroup,再通過examId定位到examsGroup中的某一物件

<span style="font-size:10px;">{"_id": 0,"examsGroup": 1}</span>
該語句控制只輸出examsGroup中的內容

(3)刪除內嵌文件examsGroup的某一物件資料

<span style="font-size:10px;">exports.deleteStudentExam =function(db,examId,callback) {
    var user = db.collection("student_exams");

    user.updateMany({"examsGroup.examId":examId},
        {$pull:{"examsGroup":{examId:examId}}},
        function(err, result) {
        if(!err) {
            callback(1)
        }
        else
            console.log(err);
    });
}</span>
因為不是刪除表中的某條資料,所以用update來更新某條資料中的內容,這裡用操作符$pull將對應examId的那個物件拉出取出來。刪除方法很多,不止這個。

updateMany:當通過查詢條件{"examsGroup.examId":examId}查詢到很多條的時候,updateMany會應用於查出來的所有條

updateOne:只會應用於查出來的第一條

(4)向內嵌文件examsGroup中增加一個物件,即增加examsGroup下的0.1.2……

<span style="font-size:10px;">user.updateMany({},{"$push":{"examsGroup" : {
        "examId" : examId,
        "examName" : examName,
        "score" : -1,
        "resultGroup" : []
    }}},function(err, result) {
        if(!err) {

            callback(result);
        }
        else{
            console.log(err);
        }
    });</span>

$push:把一個物件插進內嵌文件當中,以下是它需要插入的屬性,而且你每個物件插入的屬性都可以不一樣。
{"examsGroup" : {
        "examId" : examId,
        "examName" : examName,
        "score" : -1,
        "resultGroup" : []
    }}

(5)更新內嵌文件的score屬性的值
   student.updateOne({"examsGroup.examId":examId,userName:userName},{"$set":{"examsGroup.$.score" :totalScore}},function(err, collection) {...

$set:用來更新屬性和更新物件集合
{"$set":{"examsGroup.$.score" :totalScore}
需要這樣定位到某examId下的score

(6)給內嵌文件resultGroup插入多個物件

student.updateOne({"examsGroup.examId":examId,userName:userName},{"$pushAll":{"examsGroup.$.resultGroup" :
                        resultGroups

                    }});
resultGroups:是一個物件資料,它儲存的結構是:
[{"answer":["A"],"answerId":1,"isCorrect":false},{"answer":["B"],"answerId":2,"isCorrect":false},{"answer":["C"],"answerId":3,"isCorrect":false}]

$pushAll:可以一次插入多個value,這裡直接把整個array插入

(7)兩個表關聯處理,雖然mongodb不推薦關聯,但是對於我這種mongo初學的人來說,習慣了關係型資料庫,設計表上還是存在關聯的。

以下是Teacher表的資料結構:

array.databaseId:儲存的是exam表中某一題目的id


以下是exam表結構:


如果需要將exam表的id和Teacher表的databaseId關聯起來的話

user.find({"examId":Id}).toArray(function (err,result) {

        if(result.length!=0){

            var databaseIds = result[0];
            var idArray = new Array();
            for(var i=0;i<databaseIds.array.length;i++)
                idArray[i]=databaseIds.array[i].databaseId;
            ;
            var allTitle = db.collection("exam");
            allTitle.find({id: {$in: idArray}}, showOption).toArray(function (err, result) {
                if (!err) {

                    var sortResult = new Array();
                    for (var i = 0; i < idArray.length; i++) {
                        for (var j = 0; j < result.length; j++) {

                            if (idArray[i] == result[j].id) {
                                sortResult[i] = result[j];

                                break;
                            }
                        }
                    }
                    callback(sortResult);
                }
                else {
                    console.log(err);
                    callback({code: 404, status: "fail"});
                }

            });
        }
        else{
            callback({code:404, status:"fail"});
        }

    });

需要提到的點

1.find().toArray()方法搜出來是的一個以“[ ]”包圍的json集合,如果你查出來的是一條資料,那麼格式是:[{}]

如果是多條資料則是:[{},{}……]

當你查出來是一條資料或多條資料時,你想對某個物件操作的話:

var object = result[0];

(result是toArray回撥的結果集)

然後你就可以通過object對裡面的屬性進行操作,如:

var databaseIds = result[0];
            var idArray = new Array();
            for(var i=0;i<databaseIds.array.length;i++)
                idArray[i]=databaseIds.array[i].databaseId;
            ;

把array裡面的每一個物件的databaseId加到一個數組裡面

 allTitle.find({id: {$in: idArray}}, showOption).toArray(function (err, result) {..

exam表裡面查,如果id有存在在陣列idArray裡面的話,就符合

參考資源:

(1)mongodb:

mongodbAPI:

(2)專案和demo

(3)express

(4)nodejs