MongoDB的基本使用
MongoDB特點:
- 使用BSON存儲數據
- 支持相對豐富的查詢操作(相對其他nosql數據庫)
- 支持索引
- 副本集(支持多個實例/多個服務器運行同個數據庫)
- 分片(數據庫水平擴展)
- 無模式(同個數據文檔中的數據可以不一樣)
- 部署簡單方便(默認無密碼,也帶來安全問題)
服務的啟動:
mongod
(此前需要安裝了mongo數據庫,並創建過mongodb的目錄:$ mkdir -p /data/db)
啟動mongodb后,可以使用mongo命令行來操作數據庫,或使用Robomongo這樣的GUI客戶端。
Mongo命令行工具操作MongoDB:
使用一個數據庫:(mongodb不需要預先創建數據庫,當給一個數據庫寫入內容時會自動創建)
$ use mytest
插入數據:(給mytest數據庫下的users集合插入一條文檔)
$ db.users.insert({"username": "nuanfeng"})
然后可以查看數據庫和集合:
$ show dbs $ show collections
查看users集合中的所有文檔:
$ db.users.find()
再添加一條數據:(mongodb是無模式的,所以可以添加不同格式的數據)
$ db.users.insert({"username": "Zoe", "group": "reporter"})
再用db.users.find()查看,如下:

查看數據的數量:
$ db.users.find().count()
根據id查詢數據:
$ db.users.find({"_id": ObjectId("584bc73ea635e489676cf5db")})
更新數據: (匹配到的第一條)
$ db.users.update({"username": "Zoe"}, {$set: {"group": "writer"}})
更新數據: (匹配到的所有)
$ db.users.update({"username": "Zoe"}, {$set: {"group": "writer"}}, {multi: true})
用save()也可以修改數據:(必須根據‘_id’,會直接替換掉原來的數據)
db.users.save({"_id": ObjectId("584bc73ea635e489676cf5db"), "group": "reporter"})
刪除滿足條件的所有:
$ db.users.remove({"group": "reporter"});
刪除滿足條件的第一條:
$ db.users.remove({"group": "reporter"}, true);
刪除集合中的所有文檔:
$ db.users.remove({})
刪除整個集合(所有文檔和索引)
$ db.users.drop()
使用Mongoose模塊操作MongoDB
模塊介紹
Mongoose是將nodejs的對象和MongoDB中的文檔對應的一個模塊。
Mongoose既支持強模式,也支持無模式。
安裝mongoose:
$ npm install mongoose
先看一下最終的目錄結構:
配置與鏈接
鏈接的格式:(也可以省略用戶名、密碼、端口號)
var uri = 'mongodb://username:password@hostname:port/databasename' mongoose.connect(uri);
Model與Schema
Model使nodejs對象和MongoDB中的文檔相對應,Schema實現了Model的數據類型和結構的定義,從而在無模式的MongoDB中實現了模式化的存儲。
model.js
/** 配置並鏈接MongoDB **/
var mongoose = require('mongoose');
var uri = 'mongodb://localhost/mongoose-base';
mongoose.connect(uri);
/** 創建Schema、創建Model **/
var BookSchema = new mongoose.Schema({
name: String,
author: String,
publishTime: Date
});
mongoose.model('Book', BookSchema);
創建文檔
insert.js
var mongoose = require('mongoose');
require('./model.js');
/** 獲取Model,創建Book的實例 Entity **/
var Book = mongoose.model('Book');
var book = new Book({
name: 'MEAN Web Develop',
author: 'Green',
publishTime: new Date()
});
book.author = 'Jim'; // 參數可以重新指定
/** 插入數據 **/
book.save(function(err) { // 執行保存,並查看返回情況
console.log('save status:', err ? 'failed' : 'success');
})
簡單查詢
find.js
var mongoose = require('mongoose');
require('./model.js');
var Book = mongoose.model('Book');
/** 查詢所有數據 **/
Book.find({}, function(err, docs) {
if (err) {
console.log('err:', err);
return;
}
console.log(docs)
})
findOne.js
var mongoose = require('mongoose');
require('./model.js');
var Book = mongoose.model('Book');
/** 查詢一條數據,並修改 **/
Book.findOne({author: 'Jim'}, function(err, doc) {
if (err) {
console.log('err:', err);
return;
}
doc.author = 'James';
doc.save();
console.log('findOne result:', doc)
})
刪除文檔
remove.js
var mongoose = require('mongoose');
require('./model.js');
var Book = mongoose.model('Book');
Book.findOne({ author: 'Jim' }, function(err, doc) {
if (err) {
console.log('findOne err:', err);
return;
}
if (doc) {
doc.remove();
}
})
條件語句
var mongoose = require('mongoose');
require('./model.js');
var Book = mongoose.model('Book');
var cond = {
$or: [
{author: 'Jim'},
{author: 'James'}
]
};
Book.find(cond, function(err, docs){
if(err) {
console.log('find by cond err:', err);
}
console.log('cond:', cond, 'result:', docs);
})
在Express項目中使用Mongoose
快速生成express應用
這里我們用express-generator來快速生成express應用(先安裝好node、npm、express-generator、mongodb)
$ express mongooseExpress
先看下最終的項目結構圖:

配置數據庫並連接
新建config文件夾,用來放置數據庫配置信息
config/config.js
module.exports = {
mongodb: 'mongodb://localhost:27017/mongoose-test'
}
config/mongoose.js
var mongoose = require('mongoose');
var config = require('./config.js');
module.exports = function() {
var db = mongoose.connect(config.mongodb);
require('../models/user.server.model.js');
return db;
}
全局引入mongoose
在app.js的路由模塊前引用剛才創建的mongoose配置信息(8,9兩行)
1 var express = require('express');
2 var path = require('path');
3 var favicon = require('serve-favicon');
4 var logger = require('morgan');
5 var cookieParser = require('cookie-parser');
6 var bodyParser = require('body-parser');
7
8 var mongoose = require('./config/mongoose.js');
9 var db = mongoose();
10
11 var index = require('./routes/index');
12 var users = require('./routes/users');
創建Schema和Model
新建models文件夾
/models/user.server.model.js
var mongoose = require('mongoose');
var UserSchema = new mongoose.Schema({
uid: Number,
username: String,
createTime: Date,
lastLogin: Date
});
mongoose.model('User', UserSchema);
編寫數據庫處理邏輯代碼
我們直接在users路由模塊中加入數據庫存取操作的代碼
/routes/users.js
1 var express = require('express');
2 var router = express.Router();
3
4 var mongoose = require('mongoose');
5 var User = mongoose.model('User');
6
7 /* GET users listing. */
8 router.get('/', function(req, res, next) {
9 res.send('respond with a resource');
10 });
11
12 router.get('/test', function(req, res, next) {
13 var user = new User({
14 uid: 1,
15 username: 'nuanfeng'
16 })
17
18 user.save(function(err){
19 if(err) {
20 res.end('Error');
21 return next();
22 }
23
24 User.find({}, function(err, docs) {
25 if(err) {
26 res.end('Error');
27 return next();
28 }
29
30 res.json(docs);
31 })
32 })
33 })
34
35 module.exports = router;
運行node查看效果
$ node bin/www
然后在瀏覽器中訪問:http://localhost:3000/users/test,就能往數據庫中存入一條記錄,並在當前頁面返回它的json數據
