mongodb学习记录
Posted 邢帅杰
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mongodb学习记录相关的知识,希望对你有一定的参考价值。
由于目标计算机积极拒绝,无法连接--mongoDB连接错误解决办法
http://blog.csdn.net/mevicky/article/details/47312751
https://zhidao.baidu.com/question/1924395806192733907.html
1.在安装目录下创建 mongo.config
配置:
dbpath=D:\\mongodb\\db
logpath=D:\\mongodb\\log\\mongo.log
一个是你数据库地址,一个是日志地址,若没有,则要创建对应的文件夹和文件。
2.运行bin下的 mongo.exe,ok,可以连接了。
免安装版 下载地址:http://pan.baidu.com/s/1bo2rWir
连接mongodb方法:打开命令行,进入安装目录,进入bin目录下,运行 mongod --dbpath=D:\\mongodb\\db,dbpath是你指定的数据库目录。
完了就会返回(1 connection now open),连接成功了,目前没见到过连接失败的情况。
连接成功后,这个命令窗口就不用管它了,重开一个命令窗口,进入到bin目录,D:\\mongodb\\bin>mongo,运行mongo就可以连接到test了。
语法:
cmd,打开命令行,进入数据库目录 d: 》 cd mongodb\\bin 》 mongo
1.语法:$gt(great than),$gte(great than equal),$lt(less than),$lte(less than equal),$ne(not equal)
db.person.find({"age":{$gt:20}})
db.person.find({"age":{$gte:20}})
db.person.find({"age":{$lt:20}})
db.person.find({"age":{$lte:20}})
db.person.find({"age":{$ne:20}})
2.语法:$or,$in,$nin
db.person.find({$or:[{"name":"jay5"},{"name":"jay6"}]})
db.person.find({"name":{$in:["jay5","jay6"]}})
db.person.find({"name":{$nin:["jay5","jay6"]}})
3.使用正则:db.person.find({"name":/^j/,"name":/5$/}); //名字以j开头,以5结尾。
4.$where: db.person.find({$where:function(){return this.name=="jay5";}});//返回名字为 jay5 的数据。
5.update 修改全部字段
查找:var model = db.person.findOne({"age":20});
列出数据:model;
修改字段值:model.age=30;
根据名字修改model保存到数据库:db.person.update({"name":"jay2"},model);//这是全字段修改,即使其他字段值没有变。
6.$inc / $set 修改部分字段
$inc也就是increase的缩写,每次修改会在原有的基础上自增$inc指定的值,如果“文档”中没有此key,则会创建key。
把名字是joe的人的年龄增加30:db.person.update({"name":"joe"},{$inc:{"age":30}});//若这个记录里不存在 age 字段,那么会新增age,并设置为30.
把名字是joe的人的年龄设置为10:db.person.update({"name":"joe"},{$set:{"id":10}});//我把10改成了010,这时候得到的结果是8,不知道怎么回事。
7.update or add:若没有查到对应数据,则在数据库里新增该条数据。
db.person.update({"name":"scold"},{$inc:{"age":30}},true);
多加了一个参数,true,新增一条数据,只有两个字段,name 和 age。
8.批量更新:db.person.update({"age":26},{$set:{"address":"jiangxi"}},true,true);第四个参数,true。
9.删除,db.person.remove({"age":26});//将所有年龄是26的人删除。
10.聚合函数 count,distinct,group,mapReduce
count:db.person.count({"age":{$gt:23}});//4,其中的条件跟以往的查询一样
distinct:db.person.distinct("age");//[ 55, 18, 19, 30]提取出所有去重后的年龄集合
group:db.person.group({"key":{"age":true},"initial":{"person":[]},"$reduce":function(cur,prev){prev.person.push(cur.name);}});
//以age分组;分组形成的集合名称为person;集合中包含 name 字段。若要加入其它字段,新加语句:prev.person.push(cur.age); 这样age也会加入。结果:
[ { "age": 55, "person": [ "joe" ] }, { "age": 20, "person": [ "jay0", "jay1", "jay2" ] }, { "age": 22, "person": [ "jay3", "jay4" ] }, { "age": 25, "person": [ "jay5", "jay6", "jay7" ] } ]
示例:db.person.group({"key":{"age":true},"initial":{"pen":[]},"$reduce":function(cur,prev){prev.pen.push({"name":cur.name,"age":cur.age});}});
示例的结果:
[ { "age": 55, "pen": [ { "name": "joe", "age": 55 } ] }, { "age": 20, "pen": [ { "name": "jay0", "age": 20 }, { "name": "jay1", "age": 20 }, { "name": "jay2", "age": 20 } ] }, { "age": 22, "pen": [ { "name": "jay3", "age": 22 }, { "name": "jay4", "age": 22 } ] }, { "age": 25, "pen": [ { "name": "jay5", "age": 25 }, { "name": "jay6", "age": 25 }, { "name": "jay7", "age": 25 } ] } ]
group中 condition、finalize用法
示例:db.person.group({"key":{"age":true},"initial":{"pen":[]},"$reduce":function(cur,prev){prev.pen.push({"name":cur.name,"age":cur.age});},"finalize":function(out){out.count=out.pen.length;},"condition":{"age":{$lte:22}}});
在上述分组中,只选择小于等于22岁的人;每个分组加入人数统计。
结果数据:
[ { "age": 20, "pen": [ { "name": "jay0", "age": 20 }, { "name": "jay1", "age": 20 }, { "name": "jay2", "age": 20 } ], "count": 3 }, { "age": 22, "pen": [ { "name": "jay3", "age": 22 }, { "name": "jay4", "age": 22 } ], "count": 2 } ]
11.mapReduce
db.runCommand( { mapreduce : 字符串,集合名, map : 函数,见下文 reduce : 函数,见下文 [, query : 文档,发往map函数前先给过渡文档] [, sort : 文档,发往map函数前先给文档排序] [, limit : 整数,发往map函数的文档数量上限] [, out : 字符串,统计结果保存的集合] [, keeptemp: 布尔值,链接关闭时临时结果集合是否保存] [, finalize : 函数,将reduce的结果送给这个函数,做最后的处理] [, scope : 文档,js代码中要用到的变量] [, jsMode : 布尔值,是否减少执行过程中BSON和JS的转换,默认true] //注:false时 BSON-->JS-->map-->BSON-->JS-->reduce-->BSON,可处理非常大的mapreduce,<br> //true时BSON-->js-->map-->reduce-->BSON [, verbose : 布尔值,是否产生更加详细的服务器日志,默认true] } );
第一步:是写映射(Map)函数,可以简单的理解成分组。
var m = function(){emit(this.age,this.name);}//map
emit的第一个参数是key,就是分组的依据,这里是age,后一个是value,可以是要统计的数据,value可以是JSON对象。
这样m就会把送过来的数据根据key分组了,可以想象成如下结构:
{ "_id" : 20, "value" : { "age" : 20, "names" : [ "jay0", "jay1", "jay2" ] } }//多组这样的数据
第二步:就是简化了,编写reduce函数:
var r = function(key,values){var ret = {age:key,names:values};return ret;}//reduce
reduce函数会处理每一个分组,参数也正好是我们想像分组里的key和values。
这里reduce函数只是简单的把key和values包装了一下,因为不用怎么处理就是我们想要的结果了,然后返回一个对象。
对象结构正好和我们想象的相符。
{age:对应的age,names:[名字1,名字2..]}
第三步:编写finalize函数对reduce的返回值做最后处理。
var f = function(key,rval){rval.msg="a new life,baby!";return rval;}//finalize
这里的key还是上面的key,也就是还是age,rval是reduce的返回值,所以rval的一个实例如:{age:0,names:["name_6","name_12","name_18"]}
第四步:运行
db.runCommand({mapreduce:"person",map:m,reduce:r,finalize:f,out:"t_age_names"});//
db.t_age_names.find();
结果导入到 t_age_names 集合中,查询出来正是我想要的结果,看一下文档的结构,不难发现,_id 就是 key,value 就是处理后的返回值。
结果:
{ "_id" : 20, "value" : { "age" : 20, "names" : [ "jay0", "jay1", "jay2" ], "msg" : "a new life,baby!" } } { "_id" : 22, "value" : { "age" : 22, "names" : [ "jay3", "jay4" ], "msg" : "a new life,baby!" } } { "_id" : 25, "value" : { "age" : 25, "names" : [ "jay5", "jay6", "jay7" ], "msg" : "a new life,baby!" } } { "_id" : 55, "value" : "joe" }
12.排序,分页:db.person.find().sort({"name":1}).skip(2).limit(2);//
sort:1升序,-1降序;skip:跳过前N条;limit:取出N条。使用排序的时候,需要每条数据的字段一致。
参考来源:
http://www.cnblogs.com/huangxincheng/archive/2012/02/18/2356595.html
http://www.tuicool.com/articles/MB3uM3
http://www.cnblogs.com/loogn/archive/2012/02/09/2344054.html
http://blog.csdn.net/done58/article/details/48032471
.NET平台使用Mongo DB封装操作类:http://www.cnblogs.com/skychen1218/p/6595759.html
以上是关于mongodb学习记录的主要内容,如果未能解决你的问题,请参考以下文章