mongoDB & Nodejs 訪問mongoDB (二)

很是詳細的文檔http://mongodb.github.io/node-mongodb-native/2.2/quick-start/quick-start/node

鏈接數據庫

安裝express 和 mongodb .git

npm install express mongodb --save

經過 MongoClient.connect(url, function(err, db) {}) API 鏈接github

'use strict';
const express = require("express"),
    mongoClient = require("mongodb").MongoClient;
var app = express(),
    url = 'mongodb://localhost:27017/test';

app.listen(3000, function(err) {
    if (err) {
        console.log("has error");
    }
});
app.get("/", function(req, res) {
    mongoClient.connect(url, function(err, db) {
        if (err) {
            console.log("數據庫鏈接失敗")
        }
        res.send("鏈接成功");
        db.close();
    })
})

這樣就鏈接成功了 .mongodb

用ES6 仍是更棒的, 不過以爲配babel 比較麻煩.., 等到結尾的dao 層封裝我會使用ES6的語法來完成數據庫

插入數據

提供了兩個api,分別爲 db.collection("student").insertOne() & db.collection("student").insertManyexpress

app.get("/", function(req, res) {
    mongoClient.connect(url, function(err, db) {
        if (err) {
            console.log("數據庫鏈接失敗")
        }
        db.collection("student").insertOne({ "name": "筱原明裏", "age": "18" }, function(err, result) {
            if (err) {
                console.log(err);
            }
            res.send(result);
        })


        db.collection("student").insertMany([{ "name": "遠野貴樹", "age": "18" }, { "name": "澄田花苗" }], function(err, result) {
            if (err) {
                console.log(err);
            }
            res.send(result);
        })


        db.close();
    })
})

查找和分頁

經過db.collection().find() 會返回一個遊標,經過遊標的迭代來訪問全部數據.npm

注意,each 迭代的過程是異步的 !json

app.get("/", function(req, res) {
    mongoClient.connect(url, function(err, db) {
        if (err) {
            console.log("數據庫鏈接失敗")
        }
        var collection = db.collection('student'),
            cursor = collection.find({}),
            result = [];
        cursor.each(function(err, doc) {
            console.log(doc)
            if (err) {
                console.log(err);
            }
            if (doc == null) {
                res.send(result);
            }else{
                result.push(doc);
           }
        });
        db.close();
    })
})

可是經過each判斷是否迭代完成並非很好的方式,mongo給這個遊標賦予一個更好的方法 toArrayapi

app.get("/", function(req, res) {
    mongoClient.connect(url, function(err, db) {
        if (err) {
            console.log("數據庫鏈接失敗")
        }
        var collection = db.collection('student'),
            cursor = collection.find({});

        cursor.toArray(function(err, docs) {
            // docs 就是全部的文檔
            console.log(docs);
        })
        db.close();
    })
})

這樣作是取出所有的數據,下面是分頁查詢呢
mongoDB 的分頁查詢很是方便,封裝的skip,limit 有點像 .net 中的 EF中的skip,take 等方法.babel

app.get("/", function(req, res) {
    mongoClient.connect(url, function(err, db) {
        if (err) {
            console.log("數據庫鏈接失敗")
        }
        var collection = db.collection('student'),
            // 跳過5條再取5條
            cursor = collection.find({}).skip(10).limit(5);

        cursor.toArray(function(err, docs) {
            // docs 就是全部的文檔
            console.log(docs);
        })
        db.close();
    })
})

實際固然不能這麼寫,稍後會封裝一個DAO,在裏面會使用參數進行分頁

修改

app.get("/", function(req, res) {
    mongoClient.connect(url, function(err, db) {
        if (err) {
            console.log("數據庫鏈接失敗")
        }
        db.collection('student').updateOne({ name: "遠野貴樹" }, { $set: { age: 20, gender: "男" } }, function(err, result) {
            if (err) {
                console.log(err);
            } else {
                console.log(result);
            }
        })
        db.collection('student').updateMany({ name: "澄田花苗" }, { $set: { age: 20, gender: "女" } }, function(err, result) {
            if (err) {
                console.log(err);
            } else {
                res.send(result);
            }
        })
        db.close();
    })
})

刪除

刪除一樣包含兩個api ,deleteMany & deleteOne.

app.get("/", function(req, res) {
    mongoClient.connect(url, function(err, db) {
        if (err) {
            console.log("數據庫鏈接失敗")
        }
        db.collection("student").deleteOne({ 'name': '澄田花苗' }, function(err, result) {
            res.send(result);
        })

        db.collection("student").deleteMany({ 'name': '澄田花苗' }, function(err, result) {
            res.send(result);
        })
        db.close();
    })
})

DAO 封裝

每次像上面同樣調用確定是不可行的,因此須要封裝一個DAO層.

mongodbdao.js

/*
 * @Author: Administrator
 * @Date:   2017-03-13 17:14:40
 * @Last Modified by:   Administrator
 * @Last Modified time: 2017-03-13 20:24:23
 */

'use strict';
const mongoClient = require("mongodb").MongoClient,
    dburl = require("config").dburl;

// 鏈接數據庫,內部函數
function _connectDB(callback) {
    mongoClient.connect(dburl, function(err, db) {
            if (err) {
                console.log(err);
                return;
            }
            callback(err, db);
        }
    })
}

exports.find = function(collectionName, json, pageOption, callback) {
    // 第 0 頁,就跳過 0 條,第 1 頁,跳過10條 ,取 10條
    // skip & limit ,若是參數爲0,那麼就忽略參數
    var skipNumber = pageOption.page * pageOption.count || 0,
        takeNumber = pageOption || 0,
        sort = pageOption.sort || {};
    _connectDB(function(err, db) {
        db.collection(collectionName).find(json).skip(skipNumber).limit(takeNumber).sort(sort) toArray(function(err, docs) {
            callback(err, docs);
            db.close();
        });
    })
};

exports.insertOne = function(collectionName, json, callback) {
    _connectDB(function(err, db) {
        db.insertOne(collectionName).insertOne(function(err, res) {
            callback(err, res);
            db.close();
        })
    })
}
exports.insertMany = function(collectionName, json, callback) {
    _connectDB(function(err, db) {
        db.insertOne(collectionName).insertMany(function(err, res) {
            callback(err, res);
            db.close();
        })
    })
}



exports.deteleOne = function(collectionName, json, callback) {
    _connectDB(function(err, db) {
        db.collection(collectionName).deteleOne(json, function(err, res) {
            callback(err, res);
            db.close();
        })
    })
};

exports.deteleMany = function(collectionName, json, callback) {
    _connectDB(function(err, db) {
        db.collection(collectionName).deteleMany(json, function(err, res) {
            callback(err, res);
            db.close();
        })
    })
};

exports.updateOne = function(collectionName, jsonQeury, jsonSet, callback) {
    _connectDB(function(err, db) {
        db.collection(collectionName).updateOne(jsonQeury, { $set: jsonSet }, function(err, res) {
            callback(err, res);
            db.close();
        })
    })
};

exports.updateMany = function(collectionName, jsonQeury, jsonSet, callback) {
    _connectDB(function(err, db) {
        db.collection(collectionName).updateMany(jsonQeury, { $set: jsonSet }, function(err, res) {
            callback(err, res);
            db.close();
        })
    })
};
exports.getAllCount = function(collectionName, json, callback) {
    _connectDB(function(err, db) {
        db.collection(collectionName).count(json, function(err, count) {
            callback(err, count);
            db.close();
        })
    })
};

簡單地完成了一個DAO 的封裝,可是在項目中, 也是不會這樣用的
由於有一個更強大的東西 mongooose,它就至關於 EF 之於 ADO.NET.

相關文章
相關標籤/搜索