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

mongodb以及mongoose的使用

課程介紹看這里:http://www.nxrnyq.tw/zhangran/p/11963616.html
項目github地址:https://github.com/hellozhangran/happy-egg-server

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復制集之自動容災
posted @ 2019-12-13 08:17  張小然  閱讀(...)  評論(...編輯  收藏
四川金7乐历史开奖号码查询