mongodb手记

1、实例调用http://jcs130.iteye.com/blog/2236163
mongo命令打开的是一个javascript shell。所以js的语法在这里面都行得通,看起来是不是很牛X。      


1、单条插入数据。
第一种
db.person.insert({"name":"tomcat","age":10})
第二种
var single={"name":"jack","password":"12345","age":20,
   "address":{"province":"anhui","city":"hefei"},
   "favourite":["apple","banana"]}
  


db.user.insert(single)
第三种
single.name="joe"
single.age=25
single.address={"province":"jiangsu","city":"nanjing"}
single.favourite=["money","mm"]


db.user.insert(single)


     mongodb本身没有批量插入的方法。


 2、find 操作
>:$gt
>=:$gte
<:$lt
<=$lte
!=:$ne
=:没有特殊关键字
实例:
find age>22      
需要这么写
db.user.find({"age":{$gt:22}})

find age<22
db.user.find({"age":{$lt:22}})

find age!=22
db.user.find({"age":{$ne:22}})


find ag==22
db.user.find({"age":20})
and:没有关键字,
or:$or,
in:$in,
notIn:$nin
实例:
find name='jack' && province='anhui'
db.user.find({"name":"jack","address.province":"anhui"})


find province='anhui' || province='guangdong'
db.user.find({$or:[{"address.province":"anhui"},{"address.province":"guangdong"}]})

find province in ["anhui","guangdong"]
db.user.find({"address.province":{$in:["anhui","guangdong"]}})


find province not in ["anhui","guangdong"]
db.user.find({"address.province":{$nin:["anhui","guangdong"]}})




正则表达式 查询
find name startwith 'j' and endwith 'e'
db.user.find({"name":/^j/,"name":/e$/})


$where  条件 查询 ,参数是js的写法。
db.user.find({$where:function(){return this.name=="jack"}})
db.user.find({$where:function(){return this.name=='jack'}})


3、update 
(1)mongodb默认是整体更新,
(2)局部更新 只需更新需要的字段。
$inc和$set


$inc修改器(值增加,适用于字段类型是 int,float,double的) 
$inc是increase的缩写。
add jsck age to 60
db.person.update({"name":"jack"},{$inc:{"age":30}})

$set修改器
update jack age=10
db.person.update({"name":"jack"},{$set:{"age":10}})


(3)upsert 修改是没有数据,就新增 ,需要在最后增加参数 true
db.person.update({"name":"jackson"},{$inc:{"age":11}},true)


(4)批量更新, mongodb中匹配出多条,默认只更新第一条。需要更新多条数据是,需要在update
后面增加 参数true即可。这样update 语句后面就需要增加两个参数
如果不需要upsert的功能,就设置为 false,true
     db.person.update({"age":{$gt:0}},{$set:{"name":"edit"}},true,true)






4、remove
数据删除后不能回复,
删除 age>12的信息
db.person.remove({"age":{$gt:12}})




5、聚合函数
(1)count();
查询所有的
db.person.count()
查询age>10的
db.person.count({"age":{$gt:10}})
(2)distinct
db.person.distinct("age")
错误,不能写多个字段
db.person.distinct(["name","age"])
(3)group
key:  这个就是分组的key,我们这里是对年龄分组。


initial: 每组都分享一个”初始化函数“,特别注意:是每一组,比如这个的age=20的value的list分享一个
initial函数,age=22同样也分享一个initial函数。


$reduce: 这个函数的第一个参数是当前的文档对象,第二个参数是上一次function操作的累计对象,第一次
为initial中的{”perosn“:[]}。有多少个文档, $reduce就会调用多少次。


condition:  这个就是过滤条件。


finalize:这是个函数,每一组文档执行完后,多会触发此方法,那么在每组集合里面加上count也就是它的活了


condition和finalize 可以不写。用到的时候在写。


db.person.group({
"key":{"age":true},
"initial":{"person":[]},
"$reduce":function(cur,prev){
 prev.person.push(cur.name);
}
,"finalize":function(out){
out.count=out.person.length;
},
"condition":{"age":{$lte:15}}
})


(4)mapReduce
这玩意算是聚合函数中最复杂的了,不过复杂也好,越复杂就越灵活。


mapReduce其实是一种编程模型,用在分布式计算中,其中有一个“map”函数,一个”reduce“函数。


① map:


这个称为映射函数,里面会调用emit(key,value),集合会按照你指定的key进行映射分组。


② reduce:


这个称为简化函数,会对map分组后的数据进行分组简化,注意:在reduce(key,value)中的key就是


emit中的key,vlaue为emit分组后的emit(value)的集合,这里也就是很多{"count":1}的数组。


③ mapReduce:


这个就是最后执行的函数了,参数为map,reduce和一些可选参数。


 
function map(){
emit(this.name,{count:1});
}


function reduce(key,value){
var result={count:0};
for(var i=0;i<value.length;i++){
result.count+=value[i].count;
}
return result;
}


db.person.mapReduce(map,reduce,{"out":"collection"})
结果如下:
{
  "result":"collection",
  "timeMillis":10,
  "counts":{
      "input":6,
      "emit":6,
      "reduce":2,
      "output":4
  },
  "ok":1,

}


从图中我们可以看到如下信息:


      result: "存放的集合名“;


      input:传入文档的个数。


      emit:此函数被调用的次数。


      reduce:此函数被调用的次数。


      output:最后返回文档的个数。


最后我们看一下“collecton”集合里面按姓名分组的情况。
//查询 group后的结果
db.collection.find();


(5)、游标
mongodb里面的游标有点类似我们说的C#里面延迟执行,比如:


var list=db.person.find();


针对这样的操作,list其实并没有获取到person中的文档,而是申明一个“查询结构”,等我们需要的时候通过


for或者next()一次性加载过来,然后让游标逐行读取,当我们枚举完了之后,游标销毁,之后我们在通过list获取时,


发现没有数据返回了
var list=db.person.find();


list.forEach(function(x){
 print(x.name)
})



分页,排序都可以加进去。


var single=db.person.find().sort({"age":1,"name":2}).skip(2).limit(3);


那么这样的“查询构造”可以在我们需要执行的时候执行,大大提高了不必要的花销。






6、索引操作
for(var i=0;i<100000;i++){
var rand=parseInt(i*Math.random());
db.person.insert({"name":"hxc"+i,"age":i})


}
查看执行计划
db.person.find({"name":"hxc10000"}).explain()
建立索引
db.person.ensureIndex({"name":1})
使用ensureIndex在name上建立了索引。”1“:表示按照name进行升序,”-1“:表示按照name进行降序。


唯一索引:索引创建最好在建表的时候,索引建立之后,如果在创建是无效的。mongodb没有修改索引的语句
db.person.ensureIndex({"name":1},{"unique":true})


删除索引:两种写法都是删除索引,但是cmd显示的不一样。一个是删除单个,一个是删除多个
db.person.dropIndex({"name":1})

db.person.dropIndexes("birthday_1_name_1")


组合索引
db.person.insert({"name":"hxc","birthday":"1989-2-2"})


下面两个所以是不一样的
db.person.ensureIndex({"name":1,"birthday":1})
db.person.ensureIndex({"birthday":1,"name":1})


mongodb在查询是自动选择最优的索引使用,同时用户可以指定使用索引
db.person.find({"birthday":'1989-3-2'})


db.person.find({"birthday":"1989-3-2","name":"jack"}).hint({"birthday":1,"name":1}).explain()
db.person.find({"birthday":"1989-3-2","name":"jack"}).hint({"name":1,"birthday":1}).explain()








db.person.dropIndexes("birthday_1_name_1")




7、mongodb的主从设置
http://www.cnblogs.com/huangxincheng/archive/2012/03/04/2379755.html


http://www.cnblogs.com/huangxincheng/archive/2012/02/21/2361205.html


function map(){
emit(this.age,{count:1});
}


function reduce(key,value){
var result={count:0};
for(var i=0;i<value.length;i++){
result.count+=value[i].count;
}
return result;
}


db.person.mapReduce(map,reduce,{"out":"collection"})
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值