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"
        ]
    }
]
View Code

示例: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
            }
        ]
    }
]
View Code

 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
    }
]
View Code

 

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学习记录的主要内容,如果未能解决你的问题,请参考以下文章

python小白学习记录 多线程爬取ts片段

MongoDB 学习记录yum安装

MongoDB入门解析学习记录

MongoDB学习记录一

golang代码片段(摘抄)

mongodb学习记录