nodejs+mongoose操作mongodb副本集实例

上一篇设置mongodb副本集之后,开始使用nodejs访问mongodb副本集:

1:创建项目     express 项目名称    

2:npm install mongoose    安装mongoose包

3:mongoose连接数据库配置 (需要写primary,读从secondary读取数据,需要设置读取偏好设置)

理解MongDB驱动支持5中读偏好模式。

读偏好模式描述
primary默认模式,所有的读操作都从当前副本集主节点
primaryPreferred多数情况下,从主节点读取数据,但是如果主节点不可用了,会从从节点读取
secondary所有读操作都从副本集的从节点读取
secondaryPreferred多数情况下, 从从节点进行读操作,但是如果从节点都不可用了,从主节点读取
nearest从副本集中延迟最低的成员读取,不考虑成员的类型

 

 

 

 

 

读偏好在通过mongos连接到分片集群时也可以使用。mongos实例在连接到集群中副本集提供的分片时遵守读偏好。

【一般来说,不要使用secondary和secondaryPreferred来提供额外的读能力,因为:

  • 所有的副本集大致拥有相同的写流量,所以,从节点服务读操作的速率大致和主节点相同。
  • 副本集是异步同步的,因此在写操作成功到复制到从节点有一定的延迟。从从节点读取数据返回的可能是过期的数据,从不同从节点读取可能导致非单调读(不同节点返回不一致的数据)。
  • 对于分片集合的查询,对于均衡器开启的集群,由于不完整或被终止的块合并,从节点可能返回丢失或重复的过期数据。

分片通过增加一组机器分散读写操作增加了读写性能,这通常是增加性能更好的方法。】

 

var mongoose = require('mongoose');
mongoose.Promise = Promise;

// Promise.promisifyAll(mongoose);

var uri = 'mongodb://172.16.9.241/replSetTest,mongodb://172.16.9.240/replSetTest,mongodb://172.16.9.84/replSetTest';
var opts = {
db: { native_parser: true },
server: {
poolSize: 5 ,
auto_reconnect: true,
readPreference: "secondaryPreferred", //读偏好设置
    socketOptions: {keepAlive: 1}
},
replset: { rs_name:"testrepl",
readPreference: "secondaryPreferred"} //读偏好设置
}
//mongoose连接 global.db = mongoose.createConnection(uri,opts); mongoose.connection = global.db; db.on("error",function(err){ console.error(err); }); db.on("open",function(){ console.log("dbopen"); });

4:schema/user.js

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var moment = require("moment");

var schema = new Schema({
index: {type: Number, default: 0},
name: {type: String, default: ""},
age: {type: Number},
createdAt:{type:Date, default:Date.now()},
remark:{type:String,default:""}
});

var formatCreatedAt = schema.virtual('formatCreatedAt');
formatCreatedAt.get(function () {
return new moment(this.createdAt).format("YYYY-MM-DD HH:mm:ss:SSS");
});
schema.pre('save',function(next){
this.createdAt = Date.now();
next();
});
module.exports = schema;

5: 写数据操作,每隔一秒写入一条数据

//写数据操作
var index=0;
function getMaxIndex() {
return new Promise(function (resolve,reject) {
user.find({},function (err, items) {
console.log(items);
var maxItem = ++items.length;
console.log("maxItem:",maxItem);
if(err){
console.log("getMaxIndex:",err);
return reject(err);
}
return resolve(maxItem);
});
})
}
function createUser(index) {
console.log("index:",index);
return new Promise(function (resolve,reject) {
var u = {
index:index,
name:'user'+index,
age:22,
remark:"测试文字" };
user.create(u,function (err,res) {
if(err){
console.error(err);
return reject(err);
}
console.log("createUser:",res);
return resolve('ok');
})

})
}
setInterval(function () {
getMaxIndex().then(createUser);
},1000);

可以测试当primary节点下线,写数据操作会自动写入其他选举后的主节点

6:读操作,不停读出最大Index的记录,并将操作的数据写入文件,比对读文件时间和写数据的时间,算出同步时间长。

//读数据操作
function getUserByIndex() {
user.findOne({index:nextIndex},function (err, item) {
if (err) {
console.log("getUserByIndex:", err);
}
if(item) {
console.log(JSON.stringify(item));
let str = " Index: " + item.index + " read time: " + new moment(Date.now()).format("YYYY-MM-DD HH:mm:ss:SSS")+
" write time: " + item.formatCreatedAt + "\r\n";
content += str;
++nextIndex;
//console.log("user存在的nextIndex: ", nextIndex);

}
if(nextIndex==100){
writeFile(content);
}else {
process.nextTick(getUserByIndex);
}
});
}
getUserByIndex();

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Node.js是一个基于Chrome V8 JavaScript引擎的JavaScript运行环境,可用于服务器端编程。Express是一个基于Node.js平台的Web应用开发框架,提供了简单易用的API,可以快速构建Web应用程序。Mongoose是一个优秀的Node.js模块,用于连接MongoDB数据库,并提供了丰富的API来操作MongoDB数据库。 下面是使用Node.js、Express、Mongoose操作MongoDB的基本流程: 1. 安装Node.js、Express和Mongoose 在终端中执行以下命令: ``` npm install node npm install express npm install mongoose ``` 2. 连接MongoDB数据库 在app.js或server.js文件中,使用Mongoose连接MongoDB数据库: ``` var mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/test'); ``` 3. 定义数据模型 在models目录下创建一个JavaScript文件,使用Mongoose定义数据模型: ``` var mongoose = require('mongoose'); var Schema = mongoose.Schema; var UserSchema = new Schema({ name: String, age: Number, email: String }); module.exports = mongoose.model('User', UserSchema); ``` 4. 实现API接口 在routes目录下创建一个JavaScript文件,实现API接口: ``` var express = require('express'); var router = express.Router(); var User = require('../models/user'); router.get('/users', function(req, res, next) { User.find(function(err, users) { if (err) return next(err); res.json(users); }); }); router.post('/users', function(req, res, next) { var user = new User(req.body); user.save(function(err) { if (err) return next(err); res.json(user); }); }); router.get('/users/:id', function(req, res, next) { User.findById(req.params.id, function(err, user) { if (err) return next(err); res.json(user); }); }); router.put('/users/:id', function(req, res, next) { User.findByIdAndUpdate(req.params.id, req.body, function(err, user) { if (err) return next(err); res.json(user); }); }); router.delete('/users/:id', function(req, res, next) { User.findByIdAndRemove(req.params.id, function(err, user) { if (err) return next(err); res.json(user); }); }); module.exports = router; ``` 5. 启动Express应用 在app.js或server.js文件中启动Express应用: ``` var express = require('express'); var app = express(); var bodyParser = require('body-parser'); var userRoute = require('./routes/user'); app.use(bodyParser.json()); app.use('/api', userRoute); app.listen(3000, function() { console.log('Server listening on port 3000'); }); ``` 6. 测试API接口 通过Postman等工具测试API接口。例如: - GET http://localhost:3000/api/users - POST http://localhost:3000/api/users - GET http://localhost:3000/api/users/5f3e7003c3e1c12345678901 - PUT http://localhost:3000/api/users/5f3e7003c3e1c12345678901 - DELETE http://localhost:3000/api/users/5f3e7003c3e1c12345678901 这样就完成了使用Node.js、Express、Mongoose操作MongoDB的基本流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值