关于MongoDB(一)

Nosql DB

      这是一个非关系型数据库。 通常我们的数据库有三类:  关系型数据库(RDBMS),联机分析处理数据库(OLAP),和菲关系型数据库(NoSql)。

      MongoDB属于第三种,而且是一种基于文档的(document oriented)数据库。

 

优劣势

       优势: 查询性能,在都没有建立索引的时候,明显快于MySql。 都建立了索引后,不慢于MySql。

       劣势: 不支持事物。因此如果对于事物要求很高的情形,不适用这个数据库。

 

概念&语法

     概念

       collection:集合,等于关系型数据库中的table。

       dcoument:文档对象,等同于关系型数据库table中的一行记录。

       field: 键值对,等同于关系型数据库中table的一个column

       database:这个没啥区别。

       数据在MongoDB中是以BSON的格式存储的,所谓BSON就是binary json, 也就是二进制的json数据。

 

      语法

          属性:javascript语法。

          显示数据库: show dbs

          使用数据库: use your_db  (备注:这样子就好了,your_db不存在,则“新建”一个出来,不会报错,事实是:直到存储docuemnt对象时才创建collection和数据库)    

          插入记录: your_db.your_collection.insert(json表达式)   (备注:可以将关联的对象通过json表达式存储在一个document里面---如下图图2中的标注3所示,这个跟关系型数据库不同)

          更新记录: your_db.your_collection.update(json表达式) 

          your_db.your_collection.save(json表达式) : 实际上是插入和更新操作的合并,记录不存在则insert,存在则update。

         

          以上指令演示如下图所示:

          

 图1

 

 

          查询记录:your_db.your_collection.find({键值对},{需要显示/隐藏的字段的键值对})/findOne({键值对},{需要显示/隐藏的字段的键值对})

                注意:a) find返回的是一个cursor对象(游标对象), 而findOne返回的是一个document(一条记录)。

                find的结果可以用forEach(printjson)格式化,如下图(图中标注1)所示:

                

  图2

               

            b).findOne,对于有多条记录,则只返回第一条记录(最旧的那条).

            c). 第二个参数:{需要显示/隐藏的字段的键值对}, 要么设为白名单,即允许显示哪些字段 ,如{ ‘field1‘:1,  ‘field2‘:1,...},

              要么设置为黑名单,即指定哪些字段不显示,如 {‘field1‘:0 , ‘field2‘:0,....}

             不能混用,例如 {‘field1‘:1, ‘field2‘:0},这个是不受支持的。

             但对于_id字段例外,这个字段可以混用。

           d). 由于一个document中可能存储多级对象,引用子对象可以像js中一样用点号(.)。

              例如,已知,user对应的document中存储了name字段,这个字段是一个json对象(另外一张表--在关系型数据库中),如下        

{  "_id":ObjectId("a2349723424adfa14"),
    "name":{"first":"John","last":"Smith"}
     ....

}

           那么,如果要查询名为john的人,可以这样写js

your_db.user.find({‘name.first‘:‘John‘})

  

            e). 范式(normalization)与反范式(de-normalization)

            通常把所有的数据存储在一个document里面,这个叫做de-normalization,即用冗余换取读取的性能。这通常使用于读数据比较多的情形,比如cms系统。

            如果写数据会比较多,最好normalization一下,即通过第一,第二,第三范式将数据表(collection)重新设计。

            mongodb是支持normalization的,通过_id实现(图2中标注2),_id采用了一个特殊的算法,考虑到机器,数据库,collection,时间等因素,将其综合编码到_id中,以保证数据的唯一性。

            在normalization后的数据库中,通过link(链接),指向其他docuemt。

            例如,book对象可以有author对象的链接,如下:

            {"_id":ObjectId("book_id1123132"),

               "name":"MongoDB 30分钟精通",

               "author_id": ObjectId("author_id_say_tommy"),

                 ...

             }

             author document对象:

             {

                 "_id": ObjectId("author_id_say_tommy"),

                 "name":"Tommy",

                 ...

              }

 

            这个就是分离了冗余数据,从而有利于update数据操作。

 

          

            

              

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。