zoukankan      html  css  js  c++  java
  • MongoDB入门学习(二):MongoDB的基本概念和数据类型

            上一篇讲了MongoDB的安装和管理,当中涉及到了一些概念,数据结构另一些API的调用,不知道的没关系,事实上非常easy,这篇会简介一下。

    1.文档

            文档是MongoDB的核心概念。多个键值对有序的放在一起就是一个文档,文档是MongoDB存储数据最主要的数据结构。

    对MongoDB都是以文档的形式来操作的,使用了一种类似JSON的二进制BSON数据格式,对API的调用都是传的文档參数。每种编程语言都有标示文档的数据结构,比方java的map,lua的table,python的dict等等,可是都是差点儿相同的。一个键相应一个值。相对于MySQL而言,MongoDB的文档就相当于MySQL表中的一行数据。

    写法1
    >db.people.insert({"name" : "Mary", "age" : 10})
    写法2
    >person1 = {"name" : "Mary", "age" : 10}
    >db.people.insert(person1)

            上面这两种写法是一样的。都是将一个文档插入到数据库的people集合中。

    仅仅是另外一种写法用了一个变量person1来表示这个要插入的文档。

            文档中键值对是有序的,以下这两个文档是不一样的:

    doc1 = {"name" : "Mary", "age" : 10}
    doc2 = {"age" : 10, "name" : "Mary"}

            文档的键必须是字符串类型,可是值能够是非常多的类型,这个后面会说到。

    并且文档是区分大写和小写的。name键和Name键是有差别的。文档中的键必须是唯一的。

    2.集合

            上面说到people集合。MongoDB的集合就相当于MySQL的一个表table,MongoDB列出全部的集合能够是show tables。也能够是show collections。集合是一组文档,并且是无模式的。一个集合中的文档能够是各式各样的:

    db.people.insert({"name" : "Mary", "age" : 10})
    db.people.insert({"country" : "USA", "languge" : "english"})

            如上面给people集合中插入了两个文档,可是这两个文档是全然不同的。键都不一样,这种话。那不是全部的文档都能够放在一个集合中,确实是这种,可是这样确实是有问题的,当集合大到一定程度的时候速率就会变的很慢,并且查询效率很低。并且对于管理方面是很复杂的。所以我们也要为数据库划分不同的集合。

            上一篇看到了非常多的集合。people啊。system.indexes啊。system.users啊等。集合的命名也有一定的限制的。首先不能为空"",也不能含有空字符,不能有保留字符$,system开头的就更不行了。这个是未系统集合保留的前缀。我们仅仅要用一些非常普通易懂的命名就好了,对于我们自己的管理和操作也是非常easy的。

            MongoDB另一个子集合的概念,就是一个集合包括几个集合,这样也是便于管理,比方上面将people的基本信息和国籍信息这样放在一个people集合中有点勉强。能够直接写成一个文档放进去,也能够用两个子集合,一个表示基本信息baseinfo,一个表示国籍信息countryinfo:

    db.people.baseinfo.insert({"name" : "Mary", "age" : 10})
    db.people.countryinfo.insert("country" : "USA", "languge" : "english")

            这个样例有点牵强,可是这样也easy理解。从上面能够看出,我们还没有创建people这样一个集合就能够直接insert,这样对于使用MySQL的人来说有点难以理解,表都没创建就给它插入数据。更离谱的是我们数据库都没创建,就能够直接使用不论什么数据库use anyDatabase:

    > show dbs
    admin   0.078GB
    dhh_tp  0.078GB
    local   0.078GB
    test    0.078GB
    > use temple
    switched to db temple
    >db
    temple
    > show collections
    > db.people.insert({"name" : "Mary", "age" : 10})
    WriteResult({ "nInserted" : 1 })
    > show tables
    people
    system.indexes
    > db.people.find()
    { "_id" : ObjectId("539137ce90c0386ead60e4f4"), "name" : "Mary", "age" : 10 }

            看吧。show dbs查看全部的数据库。里面根本就没有temple,可是在直接使用的时候却不会报错,用db查看使用的哪个数据库的时候也确实是使用的temple,show collections查看全部的集合的时候一个集合都没有,由于这个数据库都不存在。哪来的表。然后直接给people集合中插入数据也不会报错。事后查询发现生成了people集合。并且还有个system.indexes集合。数据也确实插进了people集合,system.indexes存储的是集合中的索引,这个以后说。MongoDB会在插入数据的时候检查有没有这样一个数据库这样一个集合。假设不存在的话会自己主动创建,就不用我们自己创建集合,还要定义那么多的字段,字段的数据类型。长度以及是否能为空,唯一键等等,很的方便有用。

    3.数据库

            MongoDB中多个文档组成一个集合,那么多个集合就组成一个数据库,比方上面people和system.indexes组成temple数据库。MongoDB中每一个数据库之间是相互独立的,都有独立的权限,并且都是存放在不同的文件里的。

            MongoDB数据库的命名也有一定的限制的,不能有空格或者空字符。也不能包含特殊符号,应该所有小写。最多64字节,一点非常重要,数据库名终于会变成系统中的文件的,你能够打开data/db来看一下,里面就会有和你数据库一样名字的文件。它们里面就是数据库的数据。数据库的命名也应该是普通的易懂的。

    并且不能使用某些名字。比方admin。这是root数据库不用多说,local。这个数据库是不能被复制的,以后说,config。和分片有关的。这几个都是保留的数据库名。

            启动MongoDBserver上一篇也介绍过了。启动MongoDBclient上一篇也说过。运行mongo指定选项就能够了,在这里能够运行不论什么javascript程序。也能够对数据库进行一般的操作。增insert删remove查find改update之类的,这个后面会说到的。

    也有删除集合和数据库的命令:

    > show tables
    people
    system.indexes
    > db.people.drop()
    true
    > show tables
    system.indexes
    > use temple
    switched to db temple
    > db
    temple
    > db.dropDatabase()
    { "dropped" : "temple", "ok" : 1 }
    > show dbs
    admin   0.078GB
    dhh_tp  0.078GB
    local   0.078GB
    test    0.078GB

            db.dropDatabase()删除使用的数据库,db.people.drop()删除people集合。这些API用起来都非常easy。

    4.数据类型

            MongoDB有着很丰富的数据类型,如上面的name字段是字符串,age字段是数字。当然不止这两种。

    JSON仅仅有6中数据类型。null,布尔,数字,字符串,数组和对象。MongoDB在JSON的基础上加入了一些其它的数据类型,以下来看看MongoDB的数据类型:

            null:用于表示控制或者不存在的字段,如:{"x" : null}。

            布尔:仅仅有两个值true和false。

            32位整数:shell中这个类型不可用,javascript仅支持64位浮点数,所以32位整数会被自己主动转换。

            64位整数:shell中这个类型不可用。shell会使用一个特殊的内嵌文档来显示64位整数。

            64位浮点数:shell中的数字都是这个类型。{"x" : 3.14}和{"x" : 3}都是浮点数。

               由于javascript仅仅有一种数字类型就是64位浮点型。所以MongoDB中从shell的来的数字都被当做64位浮点型,而MongoDB中支持三种数字类型,所以用shell改动过数据库中的数据后都会被转换成64位浮点型。

    64位整数并不能精确的表示64位浮点型。假设MongoDB中存入了一个64位整数,在shell中查看时,假设可以表示64位浮点型那就用一个键的内置文档显示并且这个值是精确的。否则。他会显示一个多键内嵌文档,表示可能不精确。

               假设是64位整数3,那么在shell中查询显示会是这个样子:

    db.nums.findOne()
    {
            "_id" : ObjectId("4c0beecfd096a2580fe6fa08"),
            "myInteger" : {
                    "floatApprox" : 3
        }
    }

               假设是64位整数9223372036854775807,那么在shell中查询显示会是这个样子:

    db.nums.findOne()
    {
            "_id" : ObjectId("4c0beecfd096a2580fe6fa08"),
            "myInteger" : {
                    "floatApprox" : 9223372036854775807,
                    "top" : 2147483647,
                    "bottom" : 4294967295
        }
    }

               top和bottom分别表示高32位和低32位。

            字符串:UTF-8字符串都可表示为字符串类型的数据,如:{"name" : "Mary"}。

            符号:shell不支持这样的类型,shell会将数据库中的符号类型转换成字符串。

            对象id:对象id是文档的12字节的唯一ID。

               MongoDB中存储的文档必须有一个键"_id"。这个键能够是随意类型的,默认是ObjectId对象,当我们存入文档时不指定该键,那么MongoDB会自己主动加入这样一个键值对,这个值是唯一标识,ObjectId使用12字节的存储空间。

            日期:日期类型存储的是从标准纪元開始的毫秒数,不存储时区,如:{"x" : new Date()}。

               javascript中Date对象用作MongoDB的日期类型。创建日期对象要用new Date()而不是Date(),返回的是对日期的字符串表示,而不是真正的Date对象。

            正則表達式:文档中能够包括正則表達式。採用javascript的正則表達式语法,如:{"x" : /foobar/i}。

            代码:文档中还能够包括javascript代码,如:{"x" : function(){/*...*/}}。

            二进制数据:二进制数据能够由随意字节的串组成,只是shell中无法使用。

            最大值:BSON包含一个特殊类型,表示可能的最大值,shell中没有这个类型。

            最小值:BSON包含一个特殊类型。表示可能的最小值。shell中没有这个类型。

            没有定义:文档中也能够使用没有定义类型,如:{"x" : undefined}

            数组:值的集合或者列表能够表示成数组。数组中的元素能够是不同类型的数据,如:{"x" : ["a", "b", "c", 20]}。

            内嵌文档:文档能够包括别的文档,也能够作为值嵌入到父文档中。如:{"x" : {"foo" : "bar"}}。

            在我眼下用的情况,布尔,数字,字符串,日期。数组和内嵌文档是用的最多的。

  • 相关阅读:
    hdu1430 魔板(康拓展开 bfs预处理)
    网络流EdmondsKarp算法模板理解
    poj3020 建信号塔(匈牙利算法 最小覆盖边集)
    bzoj 2465 小球
    bzoj 1822 冷冻波
    bzoj 1040 骑士
    Codeforces Round #460 (Div. 2)
    bzoj 1072 排列perm
    Codeforces Round #459 (Div. 2)
    bzoj 1087 互不侵犯King
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/6789387.html
Copyright © 2011-2022 走看看