【重學Node.js 第3篇】mongodb以及mongoose的使用
阿新 • • 發佈:2019-12-13
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複製集之自動容災