mongodb以及mongoose的使用
課程介紹看這里:https://www.cnblogs.com/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文檔,其他的使用方法不一一列舉:
TODO
上面講的是目前項目中已經用到的,后續可能會繼續拓展的:
- docker與mongodb
- mongodb復制集之自動容災