MongoDB 学习笔记(一):安装及简单shell操作

一、说明

1、该系列MongoDB学习笔记的学习环境采用的MongoDB版本为mongodb-win32-i386-2.4.6,操作系统为win7。

二、安装

1、新建两个目录,分别是D:\Installations\MongoDB-2.4.6\MongoDB和D:\Installations\MongoDB-2.4.6\MongoDBDATA(利用mongod启动服务,需要指定一个数据目录用于存放数据库数据文件,Windows下默认是C:\data\db)。

2、将下载的MongoDB压缩包解压,并拷贝里面的文件至D:\Installations\MongoDB-2.4.6\MongoDB目录下,目录结构如下:

3、将bin目录配置到系统环境变量。

4、安装MongoDB数据库并启动数据库服务:如下图这样就安装了MongoDB数据库并启动服务了(通过--dbpath显示指定了数据目录),以后要启动该数据库,使用同样的命令即可。可以发现启动数据库服务后,默认情况下MongoDB监听了27017端口,且会自动启动一个http服务,监听端口为28017,在浏览器中输入http://localhost:28017就能登录web界面。

5、MongoDB还提供了以服务的形式进行数据库启动,如下:需要通过--logpath指定一个日志文件的路径


三、MongoDB与传统的关系型数据库

1、文档

它是MongoDB中数据的基本单元,类似于关系型数据库的行,多个键值对有序地放置在一起便是文档。MongoDB中对文档的区分包括:键值对的顺序,键和值的类型,键和值的大小写。在两个文档中如果这三者有任何一个不一致,这两个文档就不相同。文档中键值对的“值”的数据类型甚至还可以是整个嵌入的文档。“键”则只能是字符串,命名规则为:

  • 键不能包含“\0”(空字符),这个用于表示键的结束
  • 字符“$” 有特殊含义,在一般情况下避免使用
  • 以“_” 下划线开头的名称是为系统预留的,避免使用
另外,用“键(key)”表示表示传统关系型数据库中表的字段。
2、集合
集合在MongoDB中代表一组文档,类似于关系型数据库中的表。但在MongoDB中的表(集合)是没有模式的,可以将完全不同的文档放入同一个集合中,但从数据库管理、操作效率、构建索引等方面看,不支持这么做,最佳实践是:为特定集合隐性规定一种模式。集合的命名规范为:
  • 不能为空串""
  • 不能包含“\0”(空字符),这是集合名称结束的标志
  • 不能以“system.”开头,这个是系统保留前缀
  • 名称中不能包含"$",这个字符为系统集合使用
  • 组织集合的一个惯例是通过“.”字符分开的按命名空间划分的子集合,比如user.class,集合user(可能并不存在)和这个子集合没有任何关系
3、数据库
一组集合就可以组成一个数据库。一个MongoDB实例可以承载多个数据库。每个数据库都有独立的权限控制。其命名规范为:
  • 不能为空串""
  • 不能含有' '(空格)、.、$、\、/ 和\0(空字符)
  • 应该全部小写且最多64字节
数据库名最终会变成文件系统的文件名。MongoDB系统中有一些预置的特殊数据库,这些名称不可使用:
  • admin:从权限的角度看,这是“root”数据库,这个数据库中的用户,会继承所有数据库的权限,一些特定的服务器命令,如列出所有数据库,关闭服务器等也只能从这个数据库执行。
  • local:这个数据库中的数据不会被复制,可以用来存储本地单台服务器的任意集合
  • config:当Mongo用于分片设置时,该数据库在内部被使用,用来保存分片的相关信息。
把数据库名称放置在集合名称前面,就是集合的完全限定名,称为命名空间。完全限定名长度不得超过121个字节。

4、MongoDB中一个集合的每一个文档中的key的个数、名称以及类型可以是不一样的。

四、MongoDB数据类型

JSON在数据类型方面,只支持:null,布尔,数字,字符串,数组和对象。且JSON本身不直接支持日期类型,对于数字,也没法区分整数和浮点数,更不能区分32位数字和64位数字。MongoDB采用BSON数据格式进行数据的传输与存储,它是JSON的扩展,新增了诸如日期、浮点数等JSON不支持的数据类型。如下:

  • null:用于表示空值或不存在的字段
  • 布尔
  • 数字:Shell中数字均为64位浮点数,所以通过Shell往集合中插入的文档包含的数字均为64位浮点数。如果通过其他方式向集合中插入一个文档包含32位整数,通过Shell将这个文档进行更新,即使没有更新这个32位整数对应的键值对,这个数字也会被更新为64位浮点数。因为64位浮点数可以精确表示32位整数,显示上也没有问题。但64位浮点数表示64位整数有时就会出现问题,在Shell中查看64位整数时,会以一个内置文档的形式呈现,如下图:
             
             内置文档如果只有“floatApprox”这样一个键,说明这个64位整数可以通过64位浮点数进行精确表示,如果这个数字不能被精确表示,则Shell显示的内置文档会在内置文档中额外添加两个键 “top” 和 “bottom”,分别表示高32位和低32                    位
  • 字符串
  • 日期:在数据存储时,存储的是从标准纪元开始的毫秒数,没有存储时区信息
  • 未定义:undefined
  • 数组:数组是一组值,既可以表示为有序对象(列表,栈,队列等)也可以表示无序对象(集合)。数组可以包含不同数据类型的元素,常规键值对支持的所有值类型都可以放到数组中。数组中也可以嵌套数组。文档中的数组有个特性:MongoDB可以深入到数组内部进行搜索。
  • 内嵌文档:把一个文档整个作为另一个文档某一个键对应的值。这样来组织数据使得不用非得存为扁平结构。与数组一样,MongoDB能够理解内置文档的结构,并深入到其中来构建索引,执行查询等。
  • 正则表达式:文档中可以包含正则表达式,采用JavaScript的正则表达式语法即可。
  • 对象ID:MongoDB中存储的文档必须有一个“_id”的键,其值可以为任意类型,但必须保证其值在一个集合中是唯一的,多个集合中可以存在“_id”相同的文档。如果向集合中插入文档时没有指明“_id”,则系统会自动向文档中加上这个键,其值默认为ObjectId对象。ObjectId是“_id”的默认值类型,不同机器可以采用同样的机制去生成不同的主键。MongoDB没有采用自增长这种最常用的主键策略,是因为其天生面向分布式数据库,在大量主机间同步自增长的主键值费时,费力还容易出错。ObjectId采用12个字节的存储空间,分为四组,按照此方式生成:{0,1,2,3}|{4,5,6}|{7,8}|{9,10,11},分别是时间戳、机器、PID和计数器。这样就足可以保证这个值的唯一性。最佳实践是:在插入文档时加上这个键,并且保证其值是集合中唯一的。这样能减少数据库端的开销,并且也体现了一种设计理念:能从数据库层转移到应用层的操作就转移出去,毕竟扩展应用层比扩展数据库层容易。如果是这样做的,在插入文档后还可以将文档的“_id”直接返回给客户端,如果通过MongoDB去生成这个值,插入文档后还需find一遍,才可以得到这个值。   

五、MongoDB Shell命令行与基本使用

1、MongoDB自带一个JavaScript Shell,它是一个JavaScript解释器,还是一个MongoDB的客户端,可以通过JavaScript与启动的数据库实例进行交互(Shell中命令区分大小写)。在Shell中,每当写完一句完整的JS代码,Shell就会将其结果返回。

2、启动数据库服务后就可以登录shell命令行:如下图,默认是登录test数据库的,如果要登录admin数据库,可以使用该命令:mongo 127.0.0.1:27017/admin。也可以只使用命令mongo,则连接的是本地数据库服务器的test数据库。连接后,会将这个数据库连接赋值给全局变量db。

3、查看所有的数据库:show dbs

4、创建一个数据库与数据库之间的切换:use 数据库名,使用该命令可以在不同的数据库之间进行切换(切换全局变量db当前指向的数据库);当要切换的数据库不存在时,会创建该名称的数据库,但是这个数据库并没有真正的被创建,它只是在MongoDB缓存中,也就是在预处理缓冲池中有该数据库,如果什么也不干就离开的话,该数据库会被MongoDB自动删除;当为该数据库加入集合后才会真正地被创建。

5、查看某个数据库中所有的集合:show collections。如果该数据库中有已经存在的集合,并该集合中插入了文档,那么使用该命令查看集合时会发现多了一个system.indexes的集合,它负责存储索引,这是因为在插入一个文档时,如果没有一个叫做“_id”的key,那么会自动加入一个“_id”的key,系统默认会为该key建立唯一索引,所以在增加一个system.indexes的集合。

6、删除数据库中指定的集合:db.集合名.drop()。这里的db就是表示当前进入到的数据库,使用.集合名的方式就能够获得数据库中的某个集合,还可以使用db["集合名"]的方式来获取某个集合,特别是集合名含有某些特殊字符时,使用"."的方式很可能获取不到,此时使用[]的方式就特别有效;除了这两种方式获取一个集合外,还可以使用函数getCollection,如db.getCollection("集合名").drop()。且集合在第一次使用时会被创建。

7、删除当前数据库:db.dropDatabase()

8、shell中的help函数:当进入到某个数据库中,要如何知道可以使用哪些操作呢?此时就可以使用help函数,如下图,就能够列出数据库级别有哪些用法了,当然除了数据库级别的help,还有集合级别的help,使用方法为:db.集合名.help()。在函数名称后面不添加“()”还可以查看函数的源码。

8、Shell内置的JS引擎可以直接执行执行JS代码,如下

如果启动Shell仅是想实验一下JavaScript,则运行mongo --nodb得到的Shell没有连接任何数据库。

9、虽然Shell中提供的全局变量db指向当前连接的数据库,但还可以用其它的变量来保存其它连接的数据库,利用Shell中提供的connect()命令即可,如下图:


 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值