MongoDB学习笔记(1)

MongoDB的一些基本概念: 1 文档是MongoDB中数据的基本单元 2 集合可以看做是没有模式的表 3 MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限 4 MongoDB自带Javascript Shell 5 每一个文档都有一个特殊的键_id,它在文档所处集合中是唯一的。

文档

文档是MongoDB的核心概念。多个键及其关联的值有序地放置在一起便是文档。

  • 文档中键值对是有序的。
    1
    2
    3
    //下面两个文档是完全不同的
    {"greeting": "Hello, world!", 'foo': 1}
    {"foo": 1, "greeting": 'Hello, world!'}
  • 文档中的值不仅可以是双引号里的字符串,也可以是其他几种类型的数据。
  • 文档中的键是字符串。除了少数例外情况,键可以是任意UTF-8字符。
  • 键不能包含有\0(空字符)。这个字符用来表示键的结尾。
  • .和$有特别意义,只有在特定环境下才能使用。
  • 以下划线_开头的键是保留的,虽然这个并不是严格要求。
  • MongoDB不但区分类型,也区分大小写。
  • MongoDB的文档不能有重复的键。

集合

集合就是一组文档。文档类似关系数据中的行,集合就如同表。

无模式

集合是无模式的,一个集合里的文档可以是各式各样的。

命名

集合名可以是满足一下条件的任意utf-8字符串:

1 集合名不能是空字符串。
2 集合名不能包含有\0(空字符),这个字符表示集合名的结尾。
3 集合名不能以”system.”开头,这是为系统集合保留的前缀。
4 用户创建的集合名字不能有保留字符$。

子集合

组织集合的一种惯例是使用”.”字符分开的按命名空间划分的子集合。例:带有博客功能应用,可能包含两个集合,blog.posts和blog.authors。这样做只是为了组织结构更好,也就是说blog这个集合(这里根本就不需要存在)及其子集合没有任何关系。子集合没有特别地方,但是很有用。
MongoDB中使用子集合来组织数据是很好的方法

数据库

MongoDB中多个文档组成集合,同样多个集合就可以组成数据库。一个MongoDB实例可以承载多个数据库,它们之间可以视为完全独立的。

数据库命名可以满足以下条件的任意utf-8字符串:
1 不能使空字符串。
2 不得含有””(空格)、.、$、/、\和\0(空字符)。
3 应全部小写。
4 最多64字节。

数据库名最终会变成文件系统里的文件。

有一些数据库名是保留的: admin/local/config

把数据库的名字放到集合名前面,得到的就是集合的完全限定名,成为命名空间。例:CMS数据中使用blog.posts集合,集合的命名空间就是cms.bolg.posts。命名空间的长度不得超过121字节,在实际使用中应该小于100字节。

MongoDB shell中的基本操作(创建、读取、更新、删除–CRUD)

创建

insert函数添加一个文档到集合里面。

1
db.blog.insert({'title':'my-blog','date': new Date(), 'content':'content'})

通过db.blog.find()查看我们添加的数据,会发现有一个额外添加的键_id。

读取

find会返回集合里面所有的文档。若只想查看一个文档,可以用findOne。

1
2
3
db.blog.find()

db.blog.findOne()

更新

update接受至少两个参数,第一个是要跟新文档的限定条件,第二个是新的文档。

1
2
3
post.comments=[]

db.blog.updata({'title':'my-blog'}, post)

删除

remove用来从数据中永久删除文档。在不使用参数的情况下,会删除一个集合内所有的文档,也可以接受一个文档以指定限定条件。

1
db.blog.remove({'title':'my-blog'})

tips:
1 使用help可以查看相关的帮助。db.help()/db.mycoll.help()查看数据库、集合相关的命令帮助。
2 使用db.集合名的方式来访问集合一般不会有问题,但如果集合名恰好是数据库类的一个属性就有问题了。如果想访问version集合:

1
2
3
4
5
> db.version
function () {
return this.serverBuildInfo().version;
}

当有属性名和集合同同名时,使用getCollection函数:

1
db.getCollection('version')

数据类型

基本数据类型

MongoDB的文档类似于JSON。但JSON的表现力也有限制:只有null、布尔、数字、字符串、数组和对象几种类型。
MongoDB在保留JSON基本的键值对特性的基础上,添加了一些数据类型支持。

  • null: 用于表示空值或者不存在的字段
  • 布尔: true/false
  • 32位整数(shell中不可用)
  • 64位整数(shell中不可用)
  • 64位浮点数
  • 字符串
  • 符号(shell中不可用)
  • 对象id: 文档的12字节的唯一ID
  • 日期: 日期类型存储的是标准纪元开始的毫秒数,不存储时区
    1
    {"x": new Date()}
  • 正则表达式
    1
    {"x": /hello/g }
  • 代码
    1
    {"x": function(){ /*....*/}}
  • 二进制数据(shell中不可用)
  • 最大值(shell中不可用)
  • 最小值 (shell中不可用)
  • 未定义
  • 数组
  • 内嵌文档