zoukankan      html  css  js  c++  java
  • mongodb的基本操作与插入文档(document)

    一.mongodb的基本操作:

      1.查看mongodb当前所有的databases : show dbs

      2.选择数据库(database) : use databaseName(该数据库不存在则会自动创建,但是只存在于mongodb预设的缓存中,如果你不做任何操作,关闭数据库,那么该数据库也就不存在了,如果你往该库中添加了数据,那么该库就被真正的创建了)

      3.查看数据库中的集合(collection) : show collections 

      4.获取mongodb中的帮助 : db.help() 里面有很多的实用性的操作,在你不知道mongodb有哪些操作的时候很有帮助

      5.删除数据库 : use databaseName(必须先选择要删除的数据库), db.dropDatabase()

      6.删除指定数据库下面的集合: use databaseName(必须先选择要删除集合的数据库), db.collectionName.drop()

    二.mongodb插入文档

      因为我们的mongodb使用javascript做shell的,所以可以说mongodb的客户端编程跟javascript差不多

      往集合中插入的文档,其格式与json基本一样,所以存储在集合中的文档的格式都是bson,bson是一种类json的二进制形式的存储格式,称之为binary json

      往集合中插入新的文档有两种方式,一种是insert(),一种是save()

      区别:

        insert()方法:当插入数据时,已经存在的_id的数据,则mongodb会直接报错,并返回对应的_id

        save()方法:当插入数据时,它会先去循环一遍集合中的所有数据,判断插入的数据的_id是否存在于集合中,如果不存在则会直接插入一条新的文档,如果存在,则会调用mongodb的update()方法,更新_id对应的数据(相当于覆盖该_id的文档内容)

      语法:

        db.collectionName.insert(document)

        db.collectionName.save(document)

      注意:

        1.在插入数据之前,需要注意的是mongodb对于field(字段)的数据类型非常的敏感,比如你插入了一个age字段,内容为30,是一个string类型的,但是你如果用一个整型30去查询,是查不到该数据的,因为数据类型不对,所以插入数据的时候要慎重,考虑好字段的类型

        2.虽然mongodb灵活性很强,不像关系型数据库那样,建立一个新的字段,所有的数据都有该字段,但是在实际开发中,本人还是建议你插入数据尽量保持每一个集合的字段都相同,这样方便你在程序中的开发

      1.插入文档方法之insert()

        

        

        从上图可以看出,当你插入一条数据成功后,会返回写入的结果,插入成功,插入1条[ WriteResult({ "nInserted" : 1 }) ],而且你会发现,每条数据前面出现了一个"_id"的,它跟我们使用的关系型数据库不太一样,我们使用的关系型数据库一般primary key都是id,而且是自增的(1,2,3,4.....),而它这个是mongodb内为每条文档生成的一个唯一的标识,也具有唯一性,但是不会像关系型数据库那样自增而已,当然我们也可以插入指定的"_id"(等下说save()的时候再实践)

        a.当我们插入一条数据,这个"_id"已经存在了,会发生什么呢?

          

        b.当然insert()方法也可以插入_id(自定义_id的值,而不使用mongodb生成的_id),指定它的值跟我们关系型数据库一样(1,2,3,4,5,6....)

             

        c. mongodb能不能跟关系型数据库一样批量插入呢?关系型数据库批量插入:insert into tablename(columns)values(text1),(text2),(text3).........,而我们的mongodb是不能批量插入的,只能通过循环来实现批量插入

          

        d.在mongodb中每个document的字段field可以不相同(mongodb的灵活性,但是不建议这么做)

          

      2.插入文档方法之save():

        与insert()方法差不多都是插入文档,唯一的不同就是如果_id存在,save()则会更新这条_id对应的数据,而insert则是直接报错,并返回该_id

        

        也可以批量更新,同时不存在的则插入,存在的则更新(下图_id只有1,2,3,通过循环更新了1,2,3,同时也添加了_id为4,5的两条数据):

        

      通过上面的示例,我们可以发现:

      1.mongodb不需要事先定义collection,在第一次插入数据时,它会自动创建collection

      2.在collection中每添加一条document,除非我们自己指定_id,否则,系统都会生成一个唯一的标识ObjectId

      3.在collection中,每个document可以有不同的field(字段)

    三、关于mongodb能不能和关系型数据库那样插入成功后返回插入数据的id

       本人在写php操作mongodb的类的时候,遇到了需要返回id的问题,下面是MongoDB mode的代码:

    public function insertDocument($collection,$data=array(),$is_set=false){
            if(!$collection || empty($data) || !is_array($data)){
                die('collection and data can not be empty!');
            }
    $this->collection = $this->MongoDB->{$collection};
    try{ if($is_set){ //批量 $i=0; $count = count($data); while($i<$count){ $result[] = $this->collection->insert($data[$i],array('safe'=>true)); $i++; } }else{ //单条向集合中安全的插入数据,返回插入状态 $result = $this->collection->insert($data,array('safe'=>true)); } }catch(MongoCursorException $e){ $this->error = $e->getMessage(); return false; } return array($result,$data); }

      下面是我插入的数据:

      $arr = array('name'=>'Nginx4','age'=>121,'add_time'=>'2014-03-02');

      接下来是我插入成功后返回的信息截图:

      

      下面我进入cmd,查询返回的_id对应的数据,看看是否存在该数据,并且数据是否正确(数据一致):

      

      对比一下插入的数据,和返回的数据,你会发现插入的数据的数组中多了一个_id,mongodb在添加新的文档之前会把_id生成好,拼接到数组中,然后插入到集合中,所以我们只需要返回你要插入的数据的数组就可以得到该数据插入到集合后的_id了

      如有错误的地方,欢迎批评指正,本人新手,初学!!!!!!

  • 相关阅读:
    codeforces 455B A Lot of Games(博弈,字典树)
    HDU 4825 Xor Sum(二进制的字典树,数组模拟)
    hdu 1800 Flying to the Mars(简单模拟,string,字符串)
    codeforces 425A Sereja and Swaps(模拟,vector,枚举区间)
    codeforces 425B Sereja and Table(状态压缩,也可以数组模拟)
    HDU 4148 Length of S(n)(字符串)
    codeforces 439D Devu and Partitioning of the Array(有深度的模拟)
    浅谈sass
    京东楼层案例思维逻辑分析
    浅谈localStorage和sessionStorage
  • 原文地址:https://www.cnblogs.com/zengguowang/p/5575745.html
Copyright © 2011-2022 走看看