Mongo基礎使用,以及在Express項目中使用Mongoose

MongoDB的基本使用

MongoDB特色:

  • 使用BSON存儲數據
  • 支持相對豐富的查詢操做(相對其餘nosql數據庫)
  • 支持索引
  • 副本集(支持多個實例/多個服務器運行同個數據庫)
  • 分片(數據庫水平擴展)
  • 無模式(同個數據文檔中的數據能夠不同)
  • 部署簡單方便(默認無密碼,也帶來安全問題)

服務的啓動:

mongod

(此前須要安裝了mongo數據庫,並建立過mongodb的目錄:$ mkdir -p /data/db)node

啓動mongodb後,可使用mongo命令行來操做數據庫,或使用Robomongo這樣的GUI客戶端。sql

Mongo命令行工具操做MongoDB:

使用一個數據庫:(mongodb不須要預先建立數據庫,當給一個數據庫寫入內容時會自動建立)mongodb

$ use mytest

插入數據(給mytest數據庫下的users集合插入一條文檔)數據庫

$ db.users.insert({"username": "nuanfeng"})

而後能夠查看數據庫和集合:express

$ show dbs
$ show collections

查看users集合中的全部文檔:npm

$ db.users.find()

再添加一條數據:(mongodb是無模式的,因此能夠添加不一樣格式的數據)json

$ 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數據

相關文章
相關標籤/搜索