mongodb批量更新命令要批量执行命令怎么做

批量添加数据到mongoDB,如何才能等所有数据操作都完成了才关闭数据库连接? - CNode技术社区
这家伙很懒,什么个性签名都没有留下。
var demoUsers = [‘aaa’, ‘bbb’];
var password = ‘123456’;
var db = mongoose.createConnection(‘mongodb://127.0.0.1:27017/test’);
db.on(‘error’, function(error){
console.log(‘dbError:’ + error);
db.on(‘connected’, function(){
console.log(‘db connected!’);
demoUsers.forEach(function(user) {
console.log('开始创建用户:' + user);
createDemoUser(user, password);
// 我想在等 所有的用户都创建完成,然后在这里关闭数据连接
但是 因为createDemoUser() 里是异步的,所以,直接就执行db.Close()了,也就是 查询和写入操作还没完成数据库就已经关了,请问各位该如何控制在所有数据创建完成后再 关闭连接?
db.close();
function createDemoUser(acc, pwd) {
// !!!!这里 userDB.findUser 是异步操作,里面是封装的 mongoose 的查询
userDB.findUser(acc, pwd, function (findErr, findRes) {
if (!findErr) {
if (!findRes) {
!!!!这里 userDB.createUser 也是异步操作,里面是封装的 mongoose 的查询
userDB.createUser(acc, pwd, function (saveErr, saveRes) {
if (!saveErr) {
console.log(‘create user:’ + acc + ’ success.’);
console.log(‘create user:’ + acc + ’ failed!!!’);
console.log(‘err info:’ + saveErr);
console.log(acc + ’ already exist!’);
console.log(&userFind() occurs error!&);
CNode 社区为国内最专业的 Node.js 开源技术社区,致力于 Node.js 的技术研究。
服务器赞助商为
,存储赞助商为
,由提供应用性能服务。
新手搭建 Node.js 服务器,推荐使用无需备案的7168人阅读
数据与性能(45)
mongodb常用命令脚本化-自动化运维
把一些运维中常用到的mongodb命令写成shell脚本,极大的方便了维护
1 设置副本集
#!/bin/bash
#mongodb 进入client 并use admin
cd /usr/mongodb/bin
MongoDB='./mongo 192.168.1.7:37017'
$MongoDB &&EOF
& & & & &_id& : &Job001&,
& & & & &members& : [
& & & & & & {
& & & & & & & & &_id& : 0,
& & & & & & & & &host& : &192.168.1.7:37017&
& & & & & & }
rs.initiate(rsconf)
rs.add(&192.168.1.8:37017&)
rs.add(&192.168.1.9:37017&)
注释:把上面的内容写入***.sh文件中 chmod 777 ***.sh 赋给权限
在linux & sh ***.sh 即可完成那些命令
2 修改副本集的设置
#!/bin/bash
#mongodb 进入client 并进入primary
cd /usr/mongodb/bin
MongoDB='./mongo 192.168.1.7:37017'
$MongoDB &&EOF
use MongoModelJobResume
#rs.status()
cfg=rs.conf()
cfg.members[0].priority=99
cfg.members[1].priority=50
cfg.members[2].priority=30
rs.reconfig(cfg)
3 把一个表转到临时表,再copy回来,这样oplog中就会重新生成完整的log
(前提oplog 的size要足够大)
#!/bin/bash
#mongodb 进入client 并进入primary
cd /usr/mongodb/bin
MongoDB='./mongo 192.168.1.7:37017'
$MongoDB &&EOF
use MongoModelJobResume
rs.remove(&192.168.1.8:37017&)
rs.remove(&192.168.1.9:37017&)
db.tbJobResume.renameCollection(&tbJobResumeOld&)
db.tbJobResumeOld.copyTo(&tbJobResume&)
rs.add(&192.168.1.8:37017&)
rs.add(&192.168.1.9:37017&)
#db.tbJobResumeOld.drop()
4 按日期生成mongodb日志
mongodb日志默认写在一个文件了,时间久了查看等很不方便,用cron计划任务+脚本 可以实现按日期存放log
# rotatelog.sh 用下面的内容生成这个文件 chmod 777 rotelog.sh 赋予权限
#!/bin/bash
#mongodb client &use admin
cd /usr/mongodb/bin
MongoDB='./mongo 192.168.1.7:37017'
$MongoDB &&EOF
db.runCommand( { logRotate : 1 } )
再用 crontab -e 打开(没有就新建) 加入如下内容,并保存 (该文件路径在 /var/spool/cron/root/)
59 23 * * * /bin/sh /usr/mongodb/config/rotatelog.sh
这样的话每天晚上23点59分的时候就会把当天的日志以***日期.log的方式另存,原来的log文件会清空
5 MongoDB数据库自动备份还原的脚本
-----自动备份mongodb数据并压缩---
#!/bin/bash
filename=`date +%Y%m%d%H`
backmongodbFile=mongodb$filename.tar.gz
cd /home/mongo/back/
/usr/mongodb/bin/mongodump -h 192.168.1.7 -port 37017 -d MongoDBAgent -o mongodb_dump/
/usr/mongodb/bin/mongodump -h 192.168.1.7 -port 37017 -d MongoDBBg -o mongodb_dump/
/usr/mongodb/bin/mongodump -h 192.168.1.7 -port 37017 -d MongoModelActor -o mongodb_dump/
tar czf $backmongodbFile &mongodb_dump/
rm mongodb_dump -rf&
-----自动解压并还原mongodb数据---
#!/bin/bash
filename=''
backmongodbFile=mongodb$filename.tar.gz
cd /home/mongo/back/
tar zxvf $backmongodbFile
/usr/mongodb/bin/mongorestore -h 192.168.1.6 -port 37017 --drop -d MongoDBAgent mongodb_dump/MongoDBAgent
/usr/mongodb/bin/mongorestore -h 192.168.1.6 -port 37017 --drop -d MongoDBBg mongodb_dump/MongoDBBg
/usr/mongodb/bin/mongorestore -h 192.168.1.6 -port 37017 --drop -d MongoModelActor mongodb_dump/MongoModelActor
rm mongodb_dump -rf&
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1859066次
积分:19143
积分:19143
排名:第385名
原创:211篇
转载:448篇
评论:254条
(3)(4)(6)(5)(11)(6)(9)(6)(4)(33)(6)(7)(6)(5)(1)(10)(4)(2)(8)(7)(16)(8)(2)(4)(7)(4)(4)(14)(8)(20)(59)(7)(9)(3)(6)(5)(5)(5)(28)(5)(1)(1)(4)(5)(4)(4)(12)(6)(12)(11)(1)(10)(1)(1)(3)(4)(4)(2)(6)(7)(10)(7)(9)(3)(4)(3)(1)(10)(8)(8)(9)(4)(9)(10)(4)(2)(8)(1)(1)(1)(1)(1)(3)(3)(3)(3)(4)(14)(25)(7)(13)(8)(15)(26)说它是批量操作,就是说将集合对象一次提交到服务器,并对数据进行持久化,如果您的代码是一次一次的提交,那不算是批量操作!在之前的mongodb仓储中并没有对批量更新和批量删除进行实现,而今天在项目中,还是实现了这种批量的操作,并且已经通过测试,下面公开一下源代码
public void Insert(IEnumerable&TEntity& item)
var list = new List&WriteModel&TEntity&&();
foreach (var iitem in item)
list.Add(new InsertOneModel&TEntity&(iitem));
_table.BulkWriteAsync(list).Wait();
public void Update(IEnumerable&TEntity& item)
var list = new List&WriteModel&TEntity&&();
foreach (var iitem in item)
QueryDocument queryDocument = new QueryDocument("_id", new ObjectId(typeof(TEntity).GetProperty(EntityKey).GetValue(iitem).ToString()));
list.Add(new UpdateOneModel&TEntity&(queryDocument, Builders&TEntity&.bine(GeneratorMongoUpdate(iitem))));
_table.BulkWriteAsync(list).Wait();
public void Delete(IEnumerable&TEntity& item)
var list = new List&WriteModel&TEntity&&();
foreach (var iitem in item)
QueryDocument queryDocument = new QueryDocument("_id", new ObjectId(typeof(TEntity).GetProperty(EntityKey).GetValue(iitem).ToString()));
list.Add(new DeleteOneModel&TEntity&(queryDocument));
_table.BulkWriteAsync(list).Wait();
在程序实现之中,我们使用了WriteModel泛型对象,这将存储要插入,更新和删除的对象,对于插入来说,只有一个参数就是它的实体集合,而对象更新来说,它不仅有实体集合而且还有对应的条件QueryDocument,而对于删除操作来说,只提供QueryDocument即可!
阅读(...) 评论()(KnightLiao)
(seele~。)
第三方登录:MongoDB与传统数据库的使用区别——批量插入与批量查询
我在百X知道上回答问题时经常遇到类似与这样的问题:MongoDB有没有像MySQL一样的ODBC驱动?MongoDB能不能像MySQL一样获取字段名称或类型。
我的回答是:不行,因为MongoDB不是MySQL。这个回答显得MongoDB太弱了,我的原意是你不能要求一个物理优秀教师帮你辅导数学,也许他能做到基本的教学,但他很难做到优秀数学教师那么全面。
今天讨论的问题是:批量插入和批量查询
昨天在百X知道上有人问起MongoDB的批量插入如何写,这个我还真没用过,一方面MongoDB的速度足够快让我从来没有想过去找这种方法,另一方面MongoDB的官网以及API里也找不到这种方法。
那就带来两个问题。
问题1:这样岂不是没有速度更快的批量插入么?
这个问题毫无技术含量,MongoDB怎么可能会比MySQL慢?这里还是涉及到大家经常用到的传统关系型数据库和NoSQL的本质区别问题,NoSQL的每次操作都非常轻量级,小型化,除了数据的写入外基本没有多余的操作。再举个栗子:MongoDB就是放东西(数据)时把东西扔入相应的柜子(数据库)即可,而MySQL则要保持与送东西人的沟通(双向连接保持),东西的折叠整理分格存储(事务+有模式)。MySQL的批量插入就是减少了沟通以及分格等过程,而MongoDB本身就不存在这些过程,因此MongoDB就不存在批量插入这个概念了。结论就是,MongoDB的普通插入比MySQL的批量插入还要快,或者说MongoDB的普通插入就是批量插入。
问题2:把多个操作放入一个事务里一起执行不就不能实现了?
这个问题更没有技术含量了,MongoDB有事务么?还是那句,不要把NoSQL当关系型数据库用。那岂不是MongoDB的数据完整性和数据安全性会很差?这个,还得再重复一遍,MongoDB的设计是为了处理大规模数据的,所以对数据完整性要求不是那么严格。如果非要较真儿的话,MongoDB也可以处理这种情况,就是getLastError,它会牺牲性能以获取数据操作是否正确,你可以在批量插入一批数据后调用一次这个方法,如果出错,就把这批数据重新操作一遍,一批调用getLastError一次,既可保证性能,又可保证数据安全。
再来说一下批量查询,这里的批量对应于官网上的batch select的概念,可以理解为一次查询一批数据。很多人在使用数据库的时候会用:
Statement stmt = a.createStatement();
ResultSet rs = stmt.executeQuery(sql);
for(int i = 1; i & 10000;
//read data from rs
这样操作,会把数据库中的数据全部读入内存还是每条数据都去数据库中读一次?实际上两者都不是,MySQL会把部分数据放入内存,如果这部分数据读完了,那么再读入一部分。因为很久没用MySQL了,我记得C++的驱动中确实有一个类是用于把全部数据都读入内存的,不过这种方法很少人使用。
MongoDB的查询是这样的,你用Cursur去查询,如果没有设置batch size这个参数,那么MongoDB默认会返回101条数据,等到这101条数据读完了,也就是说用户想读第102条数据,那么驱动会再次去MongoDB中获取后面的一批数据,这批数据不是以个数记的,而是最大限制4M的大小,将这4M的数据返回供用户继续读,读完再申请4M。当然,你可以通过batch size来改变这一数值,如果设置了,那么每次返回都会返回batch size条数据。
转载请注明出处:
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 mongodb 执行系统命令 的文章

 

随机推荐