NoSQL數據庫使用
接着上一篇《Js全棧開發之Sequelize用法詳解(MySQL)》來繼續學習koa2,上一篇總結了MySQL等關係型數據庫的使用和ORM框架Sequelize的用法,本篇將彙總NoSQL類數據庫的用法,如MongoDB和Redis等,總結一些平時比較常用的api及語法。
文章目錄
1. MongoDB使用
1.1 mongoose庫安裝
npm install mongoose -save
1.2 數據庫連接
// 連接數據庫
const mongoose = require('mongoose');
mongoose.connect('mongodb://xxx.xxx.xxx.xxx:27017/admin',{
user:'root',
pass:'xxxxxx',
poolSize: 10,
useNewUrlParser: true,
useUnifiedTopology: true
});
const mongodbConn = mongoose.connection;
mongodbConn.on('error', err => {
console.error(err);
});
mongodbConn.once('open', ()=> {
console.log('連接成功!')
})
1.3 聲明創建保存model對象
const mongodbConn = mongoose.connection;
// 聲明和創建model對象
const cateqorySchema = new mongoose.Schema({
name:{
type:String,
index:true,
unique:true
},
description: String,
createArt:{
type:Date,
default: Date.now
}
});
const Category = mongodbConn.model('Category',cateqorySchema);
// 插入對象方法1
const categoryObj = new Category({
name:'編程',
description:'編程開發技術類'
});
categoryObj.save(err =>{
if(err){
console.error(err)
return;
}
else{
console.log('save success!');
}
});
// 插入對象方法2
Category.create({
name:'攝影',
description:'攝影戶外類'
},(err, category)=>{
if(err){
console.error(err);
}else{
console.log(category);
}
})
1.4 查詢修改刪除對象數據
// 查找對象
Category.find({
name: '編程'
},(err,res)=>{
if(err){
console.log(err)
}else{
console.log(res);
}
mongodbConn.close();
});
// 更新對象
Category.update({
name: '編程'
},{
description:'技術開發'
}).then((err,res)=>{
if(err){
console.log(err)
}else{
console.log(res);
}
mongodbConn.close();
});
// 刪除對象
Category.update({
name: '編程'
}).then((err,res)=>{
if(err){
console.log(err)
}else{
console.log(res);
}
mongodbConn.close();
});
2. mongoose 官方文檔
3. Redis使用
3.1 安裝Redis庫
npm install redis -save
3.2 連接Redis
const redis = require('redis');
const redisLink = 'redis://xxx.xxx.xxx:6379'
const opts = {
auth_pass: 'xxxxxx',
}
const redisClient = redis.createClient(redisLink, opts)
redisClient
.on('error', err => console.log('------ Redis connection failed ------' + err))
.on('connect', () => console.log('------ Redis connection succeed ------'))
3.3 使用Redis
// 儲存字符串
redisClient.set('name','dahlin',redis.print)
redisClient.get('name', function(err,value){
if(err) throw err;
console.log('name:'+value);
});
// 用哈希存儲數據
redisClient.hmset('dahlin',{
'item':'koa2learn',
'chapter':'use redis'
});
redisClient.hgetall('dahlin', function(err,obj){
console.log(obj)
});
redisClient.hkeys("dahlin",function(err,replies){
replies.forEach(function(reply,i){
console.log(i+"->"+reply);
})
});
// 用列表存取數據
redisClient.lpush('mylist','koa1',redis.print);
redisClient.lpush('mylist','koa2',redis.print);
redisClient.lrange('mylist',0,-1,function(err,items){
if(err){
console.log(err);
}else{
items.forEach(function(item,i){
console.log(i+":"+item);
})
}
});
// 用集合存取數據
redisClient.sadd('myset','koa1',redis.print);
redisClient.sadd('myset','koa2',redis.print);
redisClient.smembers('myset',function(err,items){
if(err){
console.log(err);
}else{
console.log(items);
}
});
3.4 使用同步方式
//封裝redis util/redis.js
const redis = require("redis");
const { promisify } = require('util');
//Redis 命令參考 http://doc.redisfans.com/index.html
/**
*
* @param {*} db 需要切換的DB,不傳則默認DB 0
*/
function Client(num){
let db = num || 0
let client = redis.createClient({db});
//需要使用同步函數,按照如下定義即可
this.exists = promisify(client.exists).bind(client);
this.keys = promisify(client.keys).bind(client);
this.set = promisify(client.set).bind(client);
this.get = promisify(client.get).bind(client);
this.del = promisify(client.del).bind(client);
this.incr = promisify(client.incr).bind(client);
this.decr = promisify(client.decr).bind(client);
this.lpush = promisify(client.lpush).bind(client);
this.hexists = promisify(client.hexists).bind(client);
this.hgetall = promisify(client.hgetall).bind(client);
this.hset = promisify(client.hset).bind(client);
this.hmset = promisify(client.hmset).bind(client);
this.hget = promisify(client.hget).bind(client);
this.hincrby = promisify(client.hincrby).bind(client);
this.hdel = promisify(client.hdel).bind(client);
this.hvals = promisify(client.hvals).bind(client);
this.hscan = promisify(client.hscan).bind(client);
this.sadd = promisify(client.sadd).bind(client);
this.smembers = promisify(client.smembers).bind(client);
this.scard = promisify(client.scard).bind(client);
this.srem = promisify(client.srem).bind(client);
return this;
}
module.exports = Client
// 同步方式使用
const Client = require('../util/redis')
let client = new Client(3); //gateway在REDIS中的默認DB 爲0
let old = await client.exists(ip);//先查詢
if (!old) {
await client.set(ip, value);
}
4. Redis參考博文
- node使用redis https://www.w3cways.com/2364.html
- Node.js Redis 的使用 https://blog.csdn.net/q282176713/article/details/80580886