1. 程式人生 > >【重學Node.js 第3篇】mongodb以及mongoose的使用

【重學Node.js 第3篇】mongodb以及mongoose的使用

mongodb以及mongoose的使用

本篇為這個系列的第三篇,想看更多可以直接去github的專案:https://github.com/hellozhangran/happy-egg-server
更多介紹可以看:https://www.cnblogs.com/zhangran/p/11963616.html

mongodb

mongodb是典型的非關係型資料庫,關於它的背景介紹和優勢劣勢這裡就不贅述,我們直接講實操或者說最有可能用到的部分。

mongodb常用指令

  • mongod --config /opt/mongodb/mongod.conf 啟動mongod服務。
    • 如果想在後臺啟動,需要修改mongod.conf,新增fork=true,然後再啟動。
    • 想關掉後臺執行的mongod服務,先檢視所有後臺執行的服務 lsof -i,找到mongod的pid號,kill yourpid
  • mongo 進入 mongo 環境
  • show dbs 檢視所有的資料庫
  • use test 進入test資料庫
  • db.createCollection('user') 建立一個user集合
    • 這裡簡單介紹一下集合的概念,mongo 是非關係型資料庫,不存在表的概念,與表相對應的是集合。當然集合不是表,與表相差很大,沒有表的行列結構,可以簡單的把集合當成一個 list,而 list 裡面會放一個個物件。有沒有發現這像極了json資料格式。
  • db.user.insert({name: 'zhangsan', age: 21, sex: 'male'})
    在集合中插入一條資料
  • db.user.find() 檢視集合user中的所有資料
  • db.user.find().pretty() 以一個漂亮點的格式顯示資料
  • db.user.find({name: 'zhangsan'}) find的第一個引數是where選擇條件,顯示符合name='zhangsan'的整條資料
  • db.user.find({name: 'zhangsan'}, {name: 1}) find的第一個引數是指定顯示內容,顯示符合條件的name,1是顯示,0是不顯示。

使用mongoose

mongoose是一個nodejs工具庫,方便使用nodejs操作mongodb

1. 首先使用mongoose連線mongodb資料庫

const mongoose = require('mongoose');

// 建立一個連線,並監聽各種事件,在執行connect操作時,各事件會視具體情況而觸發。
mongoose.connection
.on('error', function (err) {
    // 資料庫連線失敗時觸發
    console.log('connect error: ', err);
})
.on('disconnected', function () {
    // 資料庫斷開時觸發,斷開重連的邏輯可以放在這裡。
})
.once('open', function () {
    // 資料庫連線成功時觸發,express開啟listen的邏輯可以放在這裡。
});

// 啟動mongod服務預設是執行在127.0.0.1上,所以下面路徑是localhost
// test是資料庫名,如果有則連線,如果無則建立
mongoose.connect('mongodb://localhost/test', {
    useNewUrlParser: true,
    useUnifiedTopology: true
});

2. Schema與Model

在mongoose中Schema、Model是非常重要的概念。Model對應mongodb中的集合 collection,而Schema對應集合的結構,也就是結合都有哪些欄位、欄位的型別、是否必填、是否有預設值等。

const UserSchema = mongoose.Schema({
    name: String,
    age: Number,
    sex: Boolean
});

// Schema的靜態方法
UserSchema.statics.findUserByAge = function (age) {
    // 用then來拿到結果,如findUserByAge(21).then((res) => {})。
    // 也可以在find第二個引數傳回調函式
    return this.find({'age': age});
}

// Schema的例項方法
UserSchema.methods.findUserByName = function(name) {
    return this.model('User').find({ name: name });
};

// 建立一個Model,第三引數指定mongodb中collection的名字,如果不傳則預設為變為複數(即Users)
const User = mongoose.model('User', UserSchema, 'user');

// 建立一條資料
// 1. 直接用User建立
User.create({name: 'zhangsan', age: 27, sex: true}, function(err, info) {
    console.log(info);
});

// 2. 新建立一個物件再新增資料到資料庫
// 再次說明下現在mongoose預設是支援promise方式的,可以使用then 或 回撥函式的方式
var person = new User({name: 'lisi', age: 20, sex: false});
person.save().then(res => {
    console.log(res);
})

// 呼叫Schema中定義的靜態方法,可以通過User直接調
User.findUserByAge(21);

// 呼叫Schema中定義的例項方法方法,先例項化再調
const user = new User();
user.findUserByName('zhangsan');

// 刪除資料,刪除符合條件的一條
User.deleteOne({name: 'lisi'}).then();

// 刪除符合條件的所有資料
User.deleteMany({age: 20}).then();

// 注意:remove()方法已經被棄用了!

最後附上mongoose的api文件,其他的使用方法不一一列舉:

http://www.mongoosejs.net/docs/api.html

TODO

上面講的是目前專案中已經用到的,後續可能會繼續拓展的:

  • docker與mongodb
  • mongodb複製集之自動容災