Share&Joy

Ginger' Blog


  • 首页
  • 归档
  • 标签
  •   

© 2018 1-riverfish

Theme Typography by Makito

Proudly published with Hexo

MongoDB学习笔记2

发布于 2017-09-23 MongoDB 数据库 

MongoDB学习笔记2

基本概念

实例 一个实例可以拥有多个相互独立的数据库 instance
数据库 数据库拥有自己的集合,一个或多个 database
集合 集合可以看作是一个拥有动态模式(dynamic schema)的表 collection
文档 数据的基本单元,类似于关系型数据库管理系统中的行,都有一个特殊的键“_id”,这个键在文档所属的集合中是唯一的 file
  • 文档
1
2
3
4
5
6
7
//例文档
//包含一个键值对
{"greeting":"hello,world!"}

//包含多个键值对
{"greeting":"hello,world!","foo":3}
//文档中的值可以是多种不同的数据类型
  • 文档的键是字符串

    • 键不能含有\0(空字符),这个字符用于表示键的结尾
    • . 和$具有特殊的意义,只能在特定环境下使用
  • MongoDB区分类型和大小写

  • 文档不能有重复的键

  • 文档的键/值对是有序的


  • 集合

    集合就是一组文档

  • 动态模式

    动态模式意味着一个集合里的文档可以是多种多样的,尽管MongoDB没有强制要求,我们还是要创建一个模式,把相关文档组合在一起

    • 方便开发者,管理者
    • 分开查询多个集合速度快
    • 把相同类型的文档放在一个集合里,数据会更加集中
    • 更有效地对集合进行索引
  • 集合命名

    • 集合名不能是“”(空字符串)
    • 集合名不能包含\0字符
    • 集合名不能以 system. 开头
    • 用户创建的集合,不能在集合名中包含保留字符 $
  • 子集合

    组织集合的一种惯例是使用 . 分隔不同命名空间的子集合。例如一个具有博客功能的应用可能包含两个集合,分别是blog.posts和blog.authors,这里的 blog 集合跟他的子集合没有任何关系。

    在MongoDB中,使用子集合来组织数据非常高效。


  • 数据库

    每个数据库由0个或多个集合组成,都有独立的权限,即便是在磁盘上,不同的数据库也放在不同的文件中。按照经验,我们将有关一个应用程序的所有数据都存储在同一个数据库中。

  • 数据库最终会变成系统里的文件,而数据库名就是相应的文件名

  • 保留名字的数据库,可以直接访问这些具有特殊语义的数据库

admin 从身份验证角度讲,这是 “root” 数据库。如果将一个用户添加到admin数据库,这个用户将自动获得所有数据库的权限。再者,一些特定服务器端命令也只能从admin数据库运行,如列出所有数据库或关闭服务器。
local 这个数据库永远都不可以复制,且一台服务器上的所有本地集合都可以存储在这个数据库中。
config 分片设置,分片信息会存储在config数据库。

把数据库名添加到集合名前,得到集合的完全限定名,即命名空间(namespace)。例如,cms.blog.posts


  • MongoDB shell简介

    MongoDB自带JavaScript shell,可在shell中使用命令行与MongoDB实例交互。

    1. mongo 启动shell,启动时shell将自动连接MongoDB服务器,须确保mongod已启动。
    2. shell是一个功能完备的JavaScript解释器,可运行任意JS程序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//简单的数学运算
> x = 200;
200
> x / 5;
40

//JS标准库
> Math.sin(Math.PI / 2);
1
> new Date("2017/9/24");
"ISODate("2017-09-23T16:00:00Z")"
> "hello,world".replace("world","MongoDB");
hello,MongoDB

//定义和调用JS函数
> fuction factorial(n){//输入一个{ 按回车,进入下一行
...
}
> factorial(5);

需要注意,可使用多行命令。shell会检测输入的JS语句是否完整,如没写完可在下一行接着写。在某行连续三次按下回车键可取消输入未完成的命令,并退回到提示符。

  • MongoDB客户端

    shell是一个独立的MongoDB客户端。启动时,shell会连接到MongoDB服务器的test数据库,并将数据库连接赋值给全局变量db。这个变量是通过shell访问MongoDB的主要入口点。

1
2
3
4
5
6
7
8
9
10
11
//查看db当前指向哪个数据库
> db
test

//shell包含一些非JS语法的扩展,并非提供额外的功能,而是一些非常棒的语法糖。例如选择数据库
> use foobar
switched to db foobar
> db
foobar
//通过db变量,可访问其中的集合。例如,通过db.baz可返回当前数据库的baz集合
> db.baz
  • shell中的基本操作 CRUD
  • 创建 C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//insert函数,可将一个文档添加到集合中

//创建一个名为post的局部变量,这是一个JS对象
> post = {
"title":"My Blog",
"content":"Hello",
"date":new Date()
}

//在 MongoDB 中,不需要创建集合。当插入一些文档时,MongoDB 会自动创建集合。
> db.blog.insert(post);

//要查看它可调用集合的find()方法
> db.blog.find()
{ "_id" : ObjectId("59c7a8c3a65294893d568ef2"), "title" : "你好", "content" : "My Name is 1-riverfish", "date" : ISODate("2017-09-24T12:43:39.005Z") }
  • 读取
1
2
3
4
5
6
7
8
//find和findOne方法。若只想查看一个文档,可用findOne
> db.blog.findOne()
{
"_id" : ObjectId("59c7a8c3a65294893d568ef2"),
"title" : "你好",
"content" : "My Name is 1-riverfish",
"date" : ISODate("2017-09-24T12:43:39.005Z")
}

find和findOne可以接受一个查询文档作为限定条件。

show dbs空的数据库是不显示出来的

  • 更新
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//update接受(至少)两个参数:第一个是限定条件(用于匹配待更新的文档),第二个是新文档
> post.comments="写地不错"
写地不错
> post
{
"title" : "你好",
"content" : "My Name is 1-riverfish",
"date" : ISODate("2017-09-24T12:43:39.005Z"),
"comments" : "写地不错"
}
> db.blog.update({"title":"你好"},post)
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.blog.findOne()
{
"_id" : ObjectId("59c7a8c3a65294893d568ef2"),
"title" : "你好",
"content" : "My Name is 1-riverfish",
"date" : ISODate("2017-09-24T12:43:39.005Z"),
"comments" : "写地不错"
}
  • 删除
1
2
3
4
5
//remove方法,没有任何参数,它会将集合内的所有文档全部删除。它可以接受一个作为限定条件的文档作为参数
> db.blog.remove({"title":"你好"})
WriteResult({ "nRemoved" : 1 })
> db.blog.find()
>
  • 数据类型

在概念上,MongoDB的文档与JS中的对象类似,可认为它类似于JSON.MongoDB在保留JSON基本键/值对的基础上,增添了一些其他的数据类型。

名称 定义 例子
null 空值或者不存在的字段 {“x”:null}
布尔型 true/false {“x”:true}
数值/NumberInt/NumberLong 默认使用64位浮点型 {“x”:3.14}/{“x”:NumberInt(“3”)}/{“x”:NumberLong(“3”)}
字符串 {“x”:“foobar”}
日期 {“x”:new Date()}
正则表达式 查询时,使用正则表达式作为限定条件,语法与JS相同 {“x”:/foobar/i}
数组 {“x”:[1,2,3]}
内嵌文档 文档可内嵌其他文档 {“x”:{“foo”:”bar”}}
对象id 对象id是一个12字节的ID,是文档的唯一标识 {“x”:ObjectId()}
二进制数据
代码 Js代码 {“x”:function() {/ … /}}
  • Any question please contact 1-riverfish

分享到 

 上一篇: MongoDB学习笔记3 下一篇: MongoDB学习笔记1 

© 2018 1-riverfish

Theme Typography by Makito

Proudly published with Hexo