MongoDB
增删改查
增:给集合中所有对象添加同一个字段
db.tests.update({},{$set: {itemCode:"fntv_xfzf_flfgk"}}, {multi: true})
导出数据:从数据库中导出集合数据
mongoexport --port 28017 -d Ytv -c tests -o ./list.json
数据库基本操作
启动数据库
mongod --dbpath c:\database //数据库开机
mongoimport -d test -c lists ./data.js --drop //导入数据
mongoexport -d test -c lists -o ./模拟数据.js //导出数据
mongod --config D:\database\MongoDB\db1\config\mongo.conf //启动MongoDB
window系统中可以将它注册为服务,随系统启动,以管理员运行控制台(cmd)输入
mongod --config D:\Mongodb\conf\mongo.config --install --serviceName "MongoDB"
或者
mongod --install -f D:\mongodb\conf\mongo.conf //注册系统服务
启动MongoDB的方式有两种
- 1.直接启动,配置参数写在命令中:
mongod --dbpath=data/db --logpath=log/log.txt --fork
- 2.以配置文件启动:
mongod -f /etc/mongod.conf
或
mongod --config /etc/mongod.conf
Mongo shell 基本命令
mongo 进入mongodb的命令行界面
show dbs 查询所有的数据库
use test 创建库(或使用数据库)
show collections 查看test数据库中的集合
db.user.insert({name:"林场处"}) 插入数据
db.user.find() 查询所有文档
db.user.insertOne({name:"admin",passwprld:1123}) 只插入一条数据
- 数据库配置文件
#数据库路径
dbpath=D:\database\MongoDB\db1\data
#日志输出文件路径
logpath=D:\database\MongoDB\db1\logs\mongodb.log
#错误日志采用追加模式,配置这个选项后mongodb的日志会追加到现有的日志文件,而不是从新创建一个新文件
logappend=true
#启用日志文件,默认启用,MongoDB的数据操作将会写入到journal文件夹的文件里
journal=true
#这个选项可以过滤掉一些无用的日志信息,若需要调试使用请设置为false
quiet=false
#端口号 默认为27020
port=27020
链接数据库
const mongoose = require("mongoose");
mongoose.connect("mongodb://localhost:/test", {
// 避免“不建议使用当前URL字符串解析器”警告
useNewUrlParser: true,
// 避免警告信息
useUnifiedTopology: true,
// mongodb 建立索引
useCreateIndex: true,
// mongos连接池
poolSize: 5
});
module.exports = mongoose;
连接mongodb的配置信息
const mongoose = require('mongoose');
mongoose.connect(
"mongodb://192.168.77.137:27017,192.168.77.137:27018/test?replicaSet=rs", //连接多个数据库用来配合主从集群
{
useNewUrlParser: true,
poolSize: 5,
readPreference: "secondary" //集群配置
});
//判断连接是否生效
const conn = mongoose.connection;
conn.on("open", () => {
console.log('mongodb连接成功');
})
conn.on("error", () => {
console.log('mongodb连接失败');
});
- 操作数据库
const mongoose = require("../dbs/db.js");
// 制定规则
const UserSchema = new mongoose.Schema({
username: {
type: String
},
password: {
type: String
}
});
// 使用规则
const User = mongoose.model("User", UserSchema);
module.exports = {User};
配置复制集replset
Mongodb的replication主要有两种:主从和副本集(replica set)。主从的原理和mysql类似,主节点记录在其上的所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致。现在mongodb官方建议用副本集替代主从复制,现在我们来了解下如何配置复制集。
数据库配置
#ip绑定,限制ip访问
#bind_ip=127.0.0.1
#启用身份认证
#auth=true
#指定存储引擎(默认先不加此引擎,如果报错了,大家在加进去)只要不是win7,32位的,可以不用配这个
#storageEngine=mmapv1
#后台启动,是否以守护进程方式运行
#fork=true
#数据库路径
dbpath=D:\database\MongoDB\db1\data
#日志输出文件路径
logpath=D:\database\MongoDB\db1\logs\mongodb.log
#错误日志采用追加模式,配置这个选项后mongodb的日志会追加到现有的日志文件,而不是从新创建一个新文件
logappend=true
#启用日志文件,默认启用,MongoDB的数据操作将会写入到journal文件夹的文件里
journal=true
#这个选项可以过滤掉一些无用的日志信息,若需要调试使用请设置为false
quiet=false
#端口号 默认为27020
port=27020
#复制集名称
replSet=rs0
#MongoDB的启动
#mongod --config D:\database\MongoDB\db1\config\mongo.conf
主从配置信息,连接任意一个服务器,初始化命令只执行一次即可
config={
_id:"iCopy",
members:[
{_id:0,host:"127.0.0.1:27017"},
{_id:1,host:"127.0.0.1:27018"},
{_id:2,host:"127.0.0.1:27019",arbiterOnly:true}
]
}
rs.initiate(config) //初始化复制集
如果想修改复制集的配置,也可以使用rs.reconfig(config,{"force":true})强制更新配置
var config = rs.config()
config.members[0].host = '172.18.169.230:27017'
config.members[1].host = '172.18.169.232:27017'
config.members[2].host = '172.18.169.232:27018'
rs.reconfig(config,{"force":true})
secondary节点默认是不可读的,如果需要读secondary节点,需要在secondary节点上输入命令
db.getMongo().setSlaveOk()
// 或者
rs.slaveOk()
只是每次重新登录secondary节点都需要输入此命令
顺便贴一下mongoose连接复制集的option
options = {
autoReconnect: true,
poolSize: 8,
promiseLibrary: global.Promise,
useMongoClient: true,
keepAlive: 1,
connectTimeoutMS: 30000,
reconnectTries: 100,
replicaSet: 'COOL',
readPreference: 'secondaryPreferred',
}
测试数据同步
进入任何一个从节点,查看数据是否被同步
use test
rs.slaveOk()
db.test.find()
MySQL
需要安装的依赖
mysql co-mysql md5-node
"dependencies": {
"co-mysql": "^1.0.0",
"md5-node": "^1.0.1",
"mysql": "^2.18.1"
}
数据库拆分
dbs 下的db.js 文件
const mysql = require("mysql"); //数据库操作是异步的
const co = require("co-mysql"); //同步的方法操作数据库
// 数据库链接池
let db = mysql.createPool({
host: "localhost",
user: "root",
password: "663067",
database: "user"
});
module.exports = co(db);
使用
const md5 = require("md5-node");
const conn = require("../dbs/db.js");
router.post("/", async (ctx) => {
let {username, password} = ctx.request.body;
// 写入数据库
password = md5(password);
let sql = `INSERT INTO admin (user,password) VALUES ("${username}","${password}")`;
await conn.query(sql);
ctx.body = (JSON.stringify({"status": 200, "message": "注册成功"}));
});
拆分方法二
const mysql = require("mysql"); //数据库操作是异步的
const co = require("co-mysql"); //同步的方法操作数据库
const config = require("../config");
// 数据库链接池
let db = mysql.createPool({
host: "config.host",
user: "config.user",
password: "config.password",
database: "config.database"
});
module.exports = co(db);
config 文件配置
module.exports = {
host: "localhost",
user: "root",
password: "663067",
database: "user"
}