zoukankan      html  css  js  c++  java
  • mongodb学习记录

    由于目标计算机积极拒绝,无法连接--mongoDB连接错误解决办法

    http://blog.csdn.net/mevicky/article/details/47312751

    https://zhidao.baidu.com/question/1924395806192733907.html

    1.在安装目录下创建 mongo.config

    配置:

    dbpath=D:mongodbdb

    logpath=D:mongodblogmongo.log

    一个是你数据库地址,一个是日志地址,若没有,则要创建对应的文件夹和文件。

    2.运行bin下的 mongo.exe,ok,可以连接了。

    免安装版 下载地址:http://pan.baidu.com/s/1bo2rWir

    连接mongodb方法:打开命令行,进入安装目录,进入bin目录下,运行 mongod --dbpath=D:mongodbdb,dbpath是你指定的数据库目录。

    完了就会返回(1 connection now open),连接成功了,目前没见到过连接失败的情况。

    连接成功后,这个命令窗口就不用管它了,重开一个命令窗口,进入到bin目录,D:mongodbin>mongo,运行mongo就可以连接到test了。

    语法:

    cmd,打开命令行,进入数据库目录 d: 》 cd mongodbin 》 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

  • 相关阅读:
    .net Thrift 之旅 (一) Windows 安装及 HelloWorld
    软件测试中的过度设计
    血型和测试
    功能点算法及在软件测试中的应用Part2
    尘归尘 土归土
    解读SAO文化中的Share
    使用C#开发winform程序的界面框架
    怎样才能说明软件测试工作做的好?
    功能点算法及在软件测试中的应用Part1
    软件测试的核心价值是什么?
  • 原文地址:https://www.cnblogs.com/xsj1989/p/6553830.html
Copyright © 2011-2022 走看看