很是詳細的文檔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").insertMany
express
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給這個遊標賦予一個更好的方法
toArray
api
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層.
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
.