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"})
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"})