zoukankan      html  css  js  c++  java
  • MongoDB的使用

    一、什么是MongoDB?

      MongoDB 是一个基于分布式文件存储的数据库。

      MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

      MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

    二、名词解析

      1、database  数据库

      2、collection  数据表/集合

      3、document  数据记录行/文档

      4、field      字段/域

      5、index    索引

      6、primary key  主键(自动将_id字段设置为主键)

    三、什么是文档

      MongoDB 的文档,就相当于sql的数据表。文档是一组键值(key-value)对(即BSON)。

      MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。

      一个简单的文档例子如下:

        {"name":"菜鸟教程","site":"www.runoob.com","create_time":"2017-12-13"}

      其实文档的键,就相当于表中的字段,文档的键不能重复。键的命名不能为空字符,不能使用含有特别意义的符号。一般遵循数据库设计的规范吧,全是英文,用下划线隔开。

      文档的键值对是有序的。文档中的值可以不是字符串(甚至可以是整个嵌入的文档)。MongoDB区分类型和大小写。

      

    四、MongoDB的语法

      1、数据库:

        ①  use  DATABASE_NAME;  -- 如果数据库不存在,则创建数据库,否则切换到指定数据库。

        ②  db.dropDatabase()  --删除当前数据库

      2、数据表/集合:

        ①  db.createCollection(name,option)  -- 创建集合(集合名称,option是一个文档,指定有关内存大小和索引),option可选

        ②  db.COLLECTION_NAME.drop()  -- 删除集合

      3、文档

        ①  db.COLLECTION_NAME.insert(document)  -- 插入文档

        ②  db.collection.update(query,update,{upsert:boolean,mutli:boolean,writeConcern:document})  -- 更新文档(该值)

           db.collection.save({_id:ObjectId(),……})  --更新文档(覆盖,替换掉整个文档)

        ③  db.collection.remove(query,{justOne:boolean,writeConcern:document})  -- 删除文档

        ④  db.collection.find(document).pretty()  -- 查询数据(.pretty()可选,以格式化的方式显示结果)

           db.collection.findOne(document)  -- 查询数据(只返回第一个文档)

        参数说明:

          query:查询条件,找到需要更新的数据,可以理解为sql中的where

          update:update的对象和一些更新的操作符(如$,$inc...)等,可以理解为sql中update中的set

          upsert:可选,默认为false,为true时表示 如果不存在则插入数据

          multi:可选,默认为false,只更新找到的第一条记录,为true时,则更新找到的全部记录(意思就是批量更新)

          justOne:可选,如果为true或1,则只删除一个文档

          writeConcern:可选,抛出异常的级别

    五、操作符

      1、条件操作符

        ①  $gt    -- 大于

        ②  $lt     -- 小于

        ③  $gte       -- 大于等于

        ④  $lte     -- 小于等于

        ⑤  $eq     -- 等于

        ⑥  $ne     -- 不等于

        ⑦  $exist    -- 存在

        ⑧  $type     -- 数据类型

        ⑨  $mod     -- 取余

        ⑩  $regex   -- 正则表达式

      2、逻辑操作符

        ①  $or      -- 或

        ②  $and      -- 与

        ③  $not    -- 非

        ④  $nor    -- 都非

      3、数组操作符

        ①  $all      -- 数组字段中包含所有指定元素

        ②  $elemMatch  -- 内嵌文档或数组中的部分字段(field)

        ③  $size           -- 数组长度

        ④  $slice     -- 数组切片*(分页)

      4、更新操作符

        ①  $inc       -- 某个字段值自增/减某个数字

        ②  $mul      -- 某个字段值乘以某个数字

        ③  $rename     -- 重命名某个字段名

        ④  $set          -- 更新某个字段值

        ⑤  $unset         -- 删除某字段,若字段不存在则不操作

        ⑥  $min         -- 比较,若某字段值大于指定值则更新,设置最小值

        ⑦  $max        -- 比较,若某字段值小于指定值则更新,设置最大值

        ⑧  $eurrentDate    -- 设置指定字段为当前时间

        ⑨  $addToSet        -- 添加一个元素到数组中

        ⑩  $pop         -- 删除数组中的第一个或最后一个元素,-1表示第一个,1表示最后一个

        ⑪  $pullAll     -- 删除数组或内嵌文档字段中所有指定的元素

        ⑫  $pull       -- 删除满足条件的元素

        ⑬  $pushAll      -- 弃用,等同于$push和$each连用

        ⑭  $push       -- 更新某个字段值

        ⑮  $each          -- 配合$push或$addToSet使用

        ⑯  $sort         -- 配合$push使用,表示给文档中的指定数组元素排序,1是升序,-1是降序

        ⑰  $position     -- 配合$push使用表示往数组元素中的指定位置插入元素

    六、实例

     1 // 不存在则创建数据库test
     2 use test;
     3 // 创建集合(表)
     4 db.createCollection('student',{capped:true,size:100000});
     5 // 插入文档
     6 db.student.insert({"id":1,"code":"2017001","name":"xiaoming","age":18});
     7 db.student.insert({"id":2,"code":"2017002","name":"小红","age":19});
     8 // 插入多个文档
     9 db.student.insert({"id":3,"code":"2017003","name":"小强","age":20},{"id":4,"code":"2017004","name":"小刚","age":20});
    10 // 更新文档
    11 // 名字写错了,更新名字(某字段)的值,只更新第一条记录
    12 db.student.update({"id":1},{$set:{"name":"小明"}});
    13 // 批量更改
    14 db.student.update({"age":20},{$set:{"age":21}},{mutli:true});
    15 // 小刚过生日了,年龄加1
    16 db.student.update({"name":"小刚"},{$inc:{"age":1}});
    17 // save的更新操作:如果集合内已经存在 一个和obj相同的id记录,刚替换,不存在刚插入obj
    18 db.student.save({"id":2,"code":"2017002","name":"大红","age":25});
    19 //将返回集合中所有文档
    20 db.student.find({});  //db.student.find();
    21 // 查询年龄大于19的学生
    22 db.sudent.find({"age":{$gt:19}});
    23 // 查询小强的学号,_id总是被返回,设置为0移除掉
    24 db.student.findOne({"name":"小强"},{"code":1,"_id":0});
    25 // 查询名字都是小强且年龄大于等于20岁的同学
    26 db.student.find({$and:[{"name":"小强"},{"age":{$gte:20}]});     // 等同于: db.sudent.find({"name":"小强","age":{$gte:20}});
    27 // 清空集合student的文档
    28 db.student.remove({});//db.student.remove();

    七、参考链接

      http://www.runoob.com/mongodb/mongodb-tutorial.html

      http://chenzhou123520.iteye.com/blog/1637629

      http://blog.csdn.net/qq_16313365/article/details/58599253

    八、补充

    1 // 批量插入数据
    2 for(i=4;i<100;i++)db.student.insert({x:i})
    3 // 查找 从第6个开始(i从0开始),往后只要10条数据,按x排序
    4 db.student.find().skip(5).limit(10).sort({x:1})
     1 // 更新一个字段的值为另一个字段的值(字段值的复制)
     2 // 根据条件查询数据,对数据进行forEach遍历,x表示当前数据
     3 db.asset_entity.find({"asset_type":"2421"}).forEach(function(x){
     4     // if(x.pcHostEquip.id_address_out){
     5     //       db.asset_entity.update({"_id":x._id},{$set:{"asset_ip":x.pcHostEquip.id_address_out}}); 
     6     // }
     7     // if(x.pcHostEquip.id_address_in){
     8     //       db.asset_entity.update({"_id":x._id},{$set:{"asset_ip":x.pcHostEquip.id_address_in}}); 
     9     // }
    10     // 如果这个字段不为空,更新字段asset_ip
    11     if(x.raid.IP){
    12           db.asset_entity.update({"_id":x._id},{$set:{"asset_ip":x.raid.IP}}); 
    13     }
    14     // if(x.safetyEquip.IP){
    15     //       db.asset_entity.update({"_id":x._id},{$set:{"asset_ip":x.safetyEquip.IP}}); 
    16     // }
    17 });

       关于mongodb可以写js代码这个问题,我也是瞎蒙的,它到底支持哪些js语法,不支持哪些js语法,对我来说它就是个迷。

      本篇随笔的所有代码都是在Mongodb的可视化工具MongoBooster上写的,我听说甚至还存在写好一个js文件直接用Mongodb命令执行这样的神操作。

      我试过的语句中,js的基本语法都能用,DOM,BOM对象基本上不能用。console能用,alert()不能用。至于别的,我没有去试。

      下面是项目维护时改需求,增改字段的一些操作。原字段in_cabinet_location(位置),新增字段cabinet_uBegin(开始位置),cabinet_uEnd(结束位置)。

      原字段值输入格式不定,如1U-2U,1-2U,1-2,1,1U。把原字段的值赋给新字段,避免数据丢失,又不用一个个手录。新增字段的格式为只存数字。

     1 db.asset_entity.find({}).forEach(function(x){
     2     var y=x.in_cabinet_location;
     3     if(y){
     4         var index=y.indexOf("U");
     5         var index2=y.indexOf("-");
     6         if(index2<0){
     7             if(index<0){
     8  
     9             }else{
    10                 y=y.substring(0,index);
    11             }
    12             console.log(x.in_cabinet_location,y,y);
    13             // db.asset_entity.update({"_id":x._id},{$set:{"cabinet_uBegin":y}}); 
    14             // db.asset_entity.update({"_id":x._id},{$set:{"cabinet_uEnd":y}});
    15         }else{
    16             var a=y.substring(0,index2);
    17             var b=y.substring(index2+1,y.length);
    18             if(a.indexOf("U")<0){
    19                 // db.asset_entity.update({"_id":x._id},{$set:{"cabinet_uBegin":a}}); 
    20             }else{
    21                 a=a.substring(0.a.indexOf("U"));
    22             }
    23             if(b.indexOf("U")<0){
    24                 
    25             }else{
    26                 b=b.substring(0.b.indexOf("U"));
    27             }
    28             console.log(x.in_cabinet_location,a,b);
    29             // db.asset_entity.update({"_id":x._id},{$set:{"cabinet_uBegin":a}}); 
    30             // db.asset_entity.update({"_id":x._id},{$set:{"cabinet_uEnd":b}});
    31         }
    32     }
    33 });
  • 相关阅读:
    组建小型局域网
    如何解决无法登陆微软账号
    常用网页收录入口
    Google正确搜索方法
    电脑无法识别U盘(usb类外接设备)的解决办法
    如何生成一副Poker
    Camtasia Studio8使用教程
    windows蓝屏代码大全及常见蓝屏解决方案
    [bzoj3712][PA2014]Fiolki
    [NOI2018]归程
  • 原文地址:https://www.cnblogs.com/qq765065332/p/7998371.html
Copyright © 2011-2022 走看看