使用MongoChef软件,编写shell脚本的方式来执行操作,在软件中使用IntelliShell,做相关配置后即可使用
使用mongodb自带的客户端工具是相对应的
创建一个表user
一、基础操作
1、插入
db.user.insert({"name":"小王","age":20});
2、删除
db.user.remove({"name":"小王","age":20});
3、查找
db.user.find({"name":"小王"});
4、修改
(1)整体更新
db.user.update({"name":"小王"},{"name":"小王","age":19});
(2)局部更新
$inc:$inc也就是increase的缩写,在字段上自增,每次修改都会在原有的基础上,如果“文档”中没有此key,则会创建key
$set:把字段设为指定的值
db.user.update({"name":"小王"},{$set:{"age":"30"}});
(3)upsert操作
没有查到,我就在数据库里面新增一条,其实这样也有好处,就是避免了我在数据库里面判断是update还是add操作,使用起来很简单
将update的第三个参数设为true即可db.user.update({"name":"小王"},{$inc:{"age":1}},true);
(4)批量更新
在mongodb中如果匹配多条,默认的情况下只更新第一条,那么如果我们有需求必须批量更新,在update的第四个参数中设为true.
二、聚合操作
常见的聚合操作:count,distinct,group,mapReduce;
1、count
db.user.count();
db.user.count({"age":20});
2、distinct
db.user.distinct("age");
db.user.distinct("age",{"id":123});//第二个参数为查询条件
以下代码含义:在user表中查询userType 为3,6,9的userType唯一个数,当然是小于等于4的数字
db.runCommand({"distinct":"user","key":"userType","query":{"userType":{$in:[3,6,9,100]}}}).values.length;
3、group
key:这个就是分组的key,我们这里对年龄分组
initial:每组都分享一个初始化函数,比如age=20的list分享一个initail函数,age=22同样也分享一个。
$reduce:这个函数的第一个参数是当前的文档对象,第二个参数是上一次function操作的累积对象,第一次为Initial中的{"person":[]}。有多少个文档$reduce 就会调用多少次。
condition:过滤条件。
finalize:这是个函数,每组文档执行完后,都会触发此方法。那么在每组集合里面加上count也就是它来做的了。
4、mapReducedb.user.group({ "key":{"age":true}, "initial":{"person":[]}, "$reduce":function(cur,out){ out.person.push(cur.name); }, "condition":{"age":{$lt:25}}, "finalize":function(out){ out.count = out.person.length; } });
① map:这个称为映射函数,里面会调用emit(key,value),集合会按照你指定的key进行映射分组。
② reduce:
这个称为简化函数,会对map分组后的数据进行分组简化,注意:在reduce(key,value)中的key就是
emit中的key,vlaue为emit分组后的emit(value)的集合,这里也就是很多{"count":1}的数组。
③ mapReduce:
这个就是最后执行的函数了,参数为map,reduce和一些可选参数。
以下是示例
db.user.mapReduce(function(){ emit(this.name,{count:1}); }, function(key,value){ var result = {count:0}; for(var i=0; i < value[i].length; ++i){ result.count += value[i].count; } }, {"out":"collection"} );
把数据执行的结果放入collection。
可以提前定义函数,代码会简洁不少,例如
reduce function(key,value){ var result = {count:0}; for(var i=0; i < value[i].length; ++i){ result.count += value[i].count; } }
三、游标
类似于Oracle 存储过程中的游标cursor ,遍历方式稍有不同
var single=db.user.find({}).sort({"name":1}).skip(2).limit(2); single; 或者 single.forEach(function(x){ print (x.name); })
可以将游标查询结果转换为数组,游标的基本使用
var cursor=db.user.find({}); while(cursor.hasNext()){ var user = cursor.next(); ... }
四、索引操作
1、性能分析函数
2、建立索引db.user.find().explain();
db.user.ensureIndex({"name":1});
唯一索引
db.user.ensureIndex({"name":1},{"unique":true});
组合索引
查看索引db.user.ensureIndex({"name":1,"age":1});
db.user.getIndexes();
删除索引
五、主从复制db.user.dropIndexes("name_1_age_1");
六、分片技术
七、运维技术