MongoDB 基础

使用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也就是它来做的了。

db.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;
          }
});
4、mapReduce
① 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、性能分析函数

db.user.find().explain();
2、建立索引

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");
五、主从复制


六、分片技术


七、运维技术





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值