MongoDB 简明入门

MongoDB 简明入门

多看看书,学点东西。

工作是一方好药,让人很容易的走出焦虑


书中的内容,主要来自于 《mongoDB 权威指南》和 Google 。再加上点自己的思考了。

正文

简单几句话

MongoDB 是目前的主流 NoSQL 之一

NoSQL = Not only SQL


  • 文档是MangoDB 的基本单元,换关系数据库中的行的概念相似,但是其具体结构复杂的多。

  • 每个文档,都会有自己的一个特殊的键 _id 在文档所处的合集中是唯一的。

  • 多个件及其关联的值放在一起便是文档。

  • 合集就是一组文档

  • 文档之于行,合集之于表。

  • 集合是没有模式的,在关系数据库里面,每一行有固定的模式。但是在集合中是没有模式的。比如

    1
    2
    {'a':123, 'c': 234}
    {'d':354}
  • 这样的文档就可以存在于一个集合里面。

  • Q:既然集合没有模式那么存在的意义是什么呢?

    A:实际上集合,我们可以看作是一个数据关系,有关联的数据我们都可以放在一个集合里面,这样的话,就不会存在,在一堆不明事理的数据里面查找

    使用 名字对集合进行标识

    使用命名空间来划分子合集, 来体现更好的层次关系

    1
    2
    blog.posts
    blog.logs
  • mongoDB 多个文档组成集合,多个集合便组成了数据库。

  • mongoDB ,默认监听端口 27017, 使用 28017 作为简易的 HTTP 管理。

  • mongoDB 自带了一个shell ,其具有完备的 JS 解释器的功能,甚至可以用来运行JS程序, 甚至可以使用 JS 的标准库,且可以使用多行命令。

  • 在开启的时候,Shell 会自动连接数据库。mongoDB 的真正有魅力的地方在于此:数据库的连接直接赋值给全局变量 db。

    1
    2
    3
    > use test	# 选中数据库
    > db # JS 特性输出当却数据库的字符串
    > db.test # 这里输出 test 库的 test 集合

所以可见 mongoDB 在数据库的访问形式和传统的 关系数据库有了极大的改变。


MongoDB 用自己的话讲,它高度的封装了数据库,使用 键值对 的方案,很好的绕过了关系数据库中的,严格的数据模式。这样,数据本身的模式回去有了更大的自由,同一个合集下的记录里的内容可以各自不同。这样的数据库就有了更好的灵活性。于是这样,就可以很方便的封装了数据的增删查改的接口。不会想经典关系数据库中的,必须一个 列名一个 value的一样对应。

MongoDB 基础

正如 mysql 一样,拥有一个SQL语句的解释器,MongoDB 一样有一个,而且功能十分强大。

mongoDB 自带了一个shell ,其具有完备的 JS 解释器的功能,甚至可以用来运行JS程序, 甚至可以使用 JS 的标准库,且可以使用多行命令。

在这个SHELL 里面,数据库本身被封装成了一个全局变量db ,其他的基本操作,都成为了所定义的方法

  • insert
  • find /findOne
  • update
  • remove

tips : 由于本身就是Javascript 的封装,所以,我们就可以巧用 db.funcname 来查看这个方法的定义,值得注意的是,这个后面是没有括号的哦,否则就变成了调用

Shell 中的 增删查改 简明

创建,读取,更新,删除 (CRUD)

在shell中db 已经作为了一个变量,同样的这些操作,也已经被包装成了方法。


创建

在创建的时候直接使用 insert给指定的数据集合,插入一个文档。eg:

1
2
post = {'content': 'hello'}	#这里简单的定义一个文档
db.test.insert(post) # 响集合内部插入一个文档

读取

读取文档时候可以使用 find 或者 findOne 用与文档的检索

1
2
db.test.find()	# 这样会列出集合中的所有文档(默认前20条)
db.test.findOne() # 单条查询

当然在查找语句里面是可以使用限定条件的。

1
2
db.test.find({'content': 'hello'})	# 找到所有conten键为 hello 的
db.test.findOne({'content': 'hello'}) # 同上,找到一条

读取

使用 update 对文档进行更新。同同样的可以使用限定条件

1
2
post = {'content': 'world'}	# 定义更新后的文档
db.test.update({'content': 'hello'}, post)

删除

删除就直接使用 remove ,一样的加上限定条件。

1
db.test.remove({'content': 'hello'})

数据类型

在MongoDB 里面不一样,数据的类型,和结构显得更加的多元化。甚至一个键的值可以是:

  • 对象ID objectId()
    日期 new Date()
    代码 function({a=‘hello’})
    数组 [1,2,3,4,5]
    内嵌文档 如果作为字典理解的话,这个就是一个字典了。

ObjectId()

这个方法是比较重要的一个 point 了。实际上这个是一个 MongoDB 的一个全局方法。用于生成一个独一无二的ID ,独一无二这个次是不是已经说明了什么?这里我们使用shell 调用几次:

1
2
3
4
5
6
> ObjectId()
5b93fd4eab05d01ee4004b3b
> ObjectId()
5b93fe01ab05d01ee4004b3c
> ObjectId()
5b93fe08ab05d01ee4004b3d

可以看到这个方法的返回值在不断递增。其具体构成规则如下:

​ 0123 456 78 9 10 11

​ 时间戳 机器 PID 计数器

这个ID 是独一无二的,顾名思义,对象ID ,一个ID 就对应了一个文档。这个 objectId 的方法,会在添加新的文档时自动调用,创建一个 {'_id': objectId()} 的键值对。


执行四次 db.test.insert({'word':'hello'}) 之后,列出当前合集,可见其内容

_id word
5b93f56eab05d01ee4004b33 hello
5b93f578ab05d01ee4004b34 hello
5b93f578ab05d01ee4004b35 hello
5b93f579ab05d01ee4004b36 hello

技术本身在不断的,飞速的迭代着。从 Flash 到 安卓,到 Web。就在过去的短短十年,就有了这样的三座山峰。

lzxbdl

不断的 GO forward ,才能走向浪潮之巅

-------------本文结束感谢您的阅读-------------
Thanks anyway!