apache Ubuntu centos google Firefox Android Windows shell 开源 mysql 程序员 java linux nginx php 编程 wordpress 云计算 微软 Python

MongoDB基礎知識(一)

 互聯網行業的發展非常的迅速,數據存儲以及架構優化方面也有很多不同的解決方案,例如關系型數據庫、非關系型數據庫、數據倉庫技術等。更多數據庫類產品的出現,為我們很好的解決了數據存儲的問題,例如Redis緩存,mysql關系型數據庫,MongoDB文檔型數據庫,Hbase數據倉庫等。

 隨著業務的發展,在對架構優化時,選取了MongoDB存儲一部分數據,作為一個運維人員只能迎頭趕上,去學習操作和維護相關知識。下面的文檔就是自己學習MongoDB數據庫的學習筆記,主要有以下特點:

1、理論較少,主要是實際操作,

2、和關系型數據庫MySQL對比學習,主要是一些操作方面。俗話說沒有對比,就沒有傷害,兩個不同類型的數據庫對比學習,會更好的提高學習效率。

一、庫的操作

  MySQL與MongoDB在 庫、表、數據等概念上有以下差異,MySQL中有數據庫Database,表 table,數據行列等概念,而MongoDB中沒有表和行列等概念,主要包含數據庫Database,集合collections,以及文檔。

RDBMS vs NoSQL

RDBMS 
- 高度組織化結構化數據 
- 結構化查詢語言(SQL) (SQL) 
- 數據和關系都存儲在單獨的表中。 
- 數據操縱語言,數據定義語言 
- 嚴格的一致性
- 基礎事務

NoSQL 
- 代表著不僅僅是SQL
- 沒有聲明性查詢語言
- 沒有預定義的模式
-鍵 - 值對存儲,列存儲,文檔存儲,圖形數據庫
- 最終一致性,而非ACID屬性
- 非結構化和不可預知的數據
- CAP定理 
- 高性能,高可用性和可伸縮性

1.1 查看所有數據庫(已經存在)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

#MySQL

mysql> show  databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

| winner             |

+--------------------+

4 rows in set (0.04 sec)

 

#MongoDB

[root@iZ23t094y03Z ~]# mongo

MongoDB Shell version: 2.4.14

connecting to: test

> show dbsshow dbs

col     0.203125GB

local   0.078125GB

test    0.203125GB

winner2 0.203125GB

查看当前数据库

mysql> select  database();

+------------+

| database() |

+------------+

| NULL       |

+------------+

1 row in set (0.03 sec)

 

mysql> use  winner

Database changed

mysql> select  database();

+------------+

| database() |

+------------+

| winner     |

+------------+

1 row in set (0.00 sec)

 

#MongoDB

> db db 

test

註意事項:

  在MongoDB裏面,連接數據庫服務端時,在不指定數據庫名時。默認test庫,而MySQL默認是空,當我們切換到具體數據庫時,才能看到具體的當前數據庫信息。

1.2切換數據庫

在切換數據庫時,命令都是使用use + 庫名,但是兩者之間還是有比較大的區別,MongoDB中,如果沒有輸入的庫名,它會創建一個庫名,而MySQL在所有當前庫中,沒有你輸入的數據庫名時,會報錯。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

> show  dbs

col     0.203125GB

local   0.078125GB

test    0.203125GB

winner2 0.203125GB

> use  win

switched to db win

> db 

win

#MySQL

mysql> show  databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

| winner             |

+--------------------+

4 rows in set (0.00 sec)

 

mysql> use  win;

ERROR 1049 (42000): Unknown database 'win'

mysql>

1.3創建數據庫

 MongoDB沒有具體的創建數據庫的命令,一般在切換的過程中,如果不存在該數據庫,就會新建數據庫,而MySQL中有create  database  databasename語句創建數據庫。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

mysql> use  win;

ERROR 1049 (42000): Unknown database 'win'  #未创建前

mysql> create database  win;  #创建语句 一般我们创建时 还会指定字符集什么的

Query OK, 1 row affected (0.00 sec)

 

mysql> show  databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

| win                |

| winner             |

+--------------------+

5 rows in set (0.00 sec)

 

 

MongoDB

use DATABASE_NAME

如果数据库不存在,则创建数据库,否则切换到指定数据库。

1.4 刪除數據庫

  剛學完創建和切換,創建後,我們又不想要它了,所以我們考慮一下如何刪除呢???MongoDB中用db.dropDatabase()刪除當前庫,而MySQL中使用 drop  database databasename;刪除你要刪除的庫。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

MySQL

mysql> create  database winner2;  #创建库

Query OK, 1 row affected (0.00 sec)

 

mysql> use winner2;  #切换库

Database changed

mysql> select database(); #查看当前库

+------------+

| database() |

+------------+

| winner2    |

+------------+

1 row in set (0.00 sec)

 

mysql> drop database  winner2;  #删除winner2

Query OK, 0 rows affected (0.00 sec)

 

mysql> select database(); #查看当前库

+------------+

| database() |

+------------+

| NULL       |

+------------+

1 row in set (0.00 sec)

 

MongoDB

use  winner2 #创建winner库

switched to db winner2

show   dbs;#查看当前所有的库

col     0.203125GB

winner2 0.203125GB

db  #查看当前库

winner2

MySQL中删除某个当前库后,再次查看当前库是NULL,而MongoDB中删除当前库后,仍然显示当前库

db.dropDatabase() #删除当前库

"dropped" "winner2""ok" : 1 }

> db  检查当前库

winner2

show  dbs#检查所有的库

col     0.203125GB

>

2、表與集合操作

 在我們學習過數據庫相關理論知識後,我們都知道數據是存儲在表中,而數據庫是用來存儲數據表的。而MongoDB和MySQL的表概念是不一樣的,MongoDB是將文檔數據存儲在集合(collection)中,而MySQL是將數據存儲在表(table)中,集合是沒有表的結構的,而表是有相關的結構,例如字段、字段類型、索引、主鍵、存儲引擎等。

2.1 查看當前所有表

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

#MySQL

mysql> use  mysql 

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

 

Database changed

mysql> show tables;

+---------------------------+

| Tables_in_mysql           |

+---------------------------+

| columns_priv              |

| db                        |

| event                     |

| func                      |

| general_log               |

| help_category             |

| help_keyword              |

| help_relation             |

| help_topic                |

| innodb_index_stats        |

| innodb_table_stats        |

 

#MongoDB

show  dbs

col     0.203125GB

> use col

switched to db col

> show  collections

system.indexes

winner

winner2

>

2.2 創建表或者集合

 MySQL數據是存儲在相關的表中,而MongoDB數據是存儲在集合中,MySQL由於支持插件式存儲引擎,字段類型、索引、主鍵、等原因,讓其創建表結構的語句比較復雜,在應用系統中,性能優化等情況和表結構息息相關。而MongoDB主要是用來存儲key(values)類型的數據,所以要簡單很多。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

mysql> use  winner

Database changed

mysql> show  tables

    -> ;

Empty set (0.00 sec)

 

mysql> create  table  winer(id  int not null primary key auto_increment,

    -> name   varchar(20) not null ,

    -> age  tinyint not null,

    -> sex  tinyint not null default '0') engine=innodb charset utf8;

Query OK, 0 rows affected (0.24 sec)

mysql> desc  winer;

+-------+-------------+------+-----+---------+----------------+

| Field | type        | Null | Key | Default | Extra          |

+-------+-------------+------+-----+---------+----------------+

id    | int(11)     | NO   | PRI | NULL    | auto_increment |

| name  | varchar(20) | NO   |     | NULL    |                |

| age   | tinyint(4)  | NO   |     | NULL    |                |

| sex   | tinyint(4)  | NO   |     | 0       |                |

+-------+-------------+------+-----+

#MongoDB创建集合

在MongoDB中,要操作一个集合,并不需要先创建它。可以直接往集合里面插入数据,如果集合不存在,

会自动创建集合,并插入数据。

2.3 表與集合的增刪改查

 在知道了如何創建一個表、集合等相關知識後,我們就要想著如何對表或者集合數據做修改,而我們的應用系統、業務系統中存儲的數據主要就是增刪改查等相關的操作。

2.3.1插入數據

MySQL中插入數據

創建表SQL語句

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

 CREATE TABLE `winer` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `name` varchar(20) NOT NULL,

  `age` tinyint(4) NOT NULL,

  `sex` tinyint(4) NOT NULL DEFAULT '0',

  PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 

表结构

mysql> desc winer

    -> ;

+-------+-------------+------+-----+---------+----------------+

| Field | Type        | Null | Key | Default | Extra          |

+-------+-------------+------+-----+---------+----------------+

id    | int(11)     | NO   | PRI | NULL    | auto_increment |

| name  | varchar(20) | NO   |     | NULL    |                |

| age   | tinyint(4)  | NO   |     | NULL    |                |

| sex   | tinyint(4)  | NO   |     | 0       |                |

+-------+-------------+------+-----+---------+----------------+

4 rows in set (0.00 sec)

1、插入单条数据

1

2

3

4

5

6

7

8

9

10

11

mysql> insert into winer (name,age,sex) values("MySQL",20,1)

    -> ;

Query OK, 1 row affected (0.09 sec)

 

mysql> select  * from winer;

+----+-------+-----+-----+

id | name  | age | sex |

+----+-------+-----+-----+

|  1 | MySQL |  20 |   1 |

+----+-------+-----+-----+

1 row in set (0.00 sec)

2、批量插入

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

mysql> insert into winer (name,age,sex) value("MySQL",20,1),("Docker",8,0)

    -> ;

Query OK, 2 rows affected (0.00 sec)

Records: 2  Duplicates: 0  Warnings: 0

 

mysql> insert into winer (name,age,sex) values("MySQL",20,1),("Docker",8,0)

    -> ;

Query OK, 2 rows affected (0.01 sec)

Records: 2  Duplicates: 0  Warnings: 0

两个插入语句之间区别value和values两者都能插入单个值或者批量值

mysql> select  * from winer;

+----+--------+-----+-----+

id | name   | age | sex |

+----+--------+-----+-----+

|  1 | MySQL  |  20 |   1 |

|  2 | MySQL  |  20 |   1 |

|  3 | Docker |   8 |   0 |

|  4 | MySQL  |  20 |   1 |

|  5 | Docker |   8 |   0 |

+----+--------+-----+-----+

5 rows in set (0.00 sec)

3、其他插入數據的方法

MySQL中除了傳統的insert into插入數據外,我們還可以用load data  mysqlimport等方式導入數據,也可以將其他表中的數據插入到某張表中,具體方法不做詳細描述。

2.3.2 MongoDB中插入數據

 MongoDB主要存儲的是文檔數據,文檔的數據結構和JSON基本一樣。所有存儲在集合中的數據都是BSON格式。BSON是一種類json的一種二進制形式的存儲格式,簡稱Binary JSON。

插入文檔

MongoDB 使用 insert() 或 save() 方法向集合中插入文檔,語法如下:

1

2

3

db.COLLECTION_NAME.insert(document)

 

db.COLLECTION_NAME.save(document)

1、简单的插入

1

2

3

4

5

6

db.winner.find() #插入前 MongoDB中用find查看以前的数据类似mysql中的select

> db.winner.insert({name:"Linux"})

#插入结果

>db.winner.find()

"_id" : ObjectId("592bf6bf1b8e279c43cbb021"), "name" "linux" }

>

2、定义变量

1

2

3

4

5

6

7

8

9

10

> SQLNAME=({"titile":"MongoDB学习实践",

 description: "MongoDB是NoSQL数据库",

 by:"书籍学习"})

  

可以将我们要插入的数据定义成变量,后面使用加载变量的方式来实现数据的插入

> db.sql.insert(SQLNAME)

 

> db.sql.find()

"_id" : ObjectId("592bf8b5f3fed7ab45761fc1"), "titile" "MongoDB学习实践""description" "MongoDB是NoSQL数据库""by" "书籍学习" }

>

 

3、for循环插入

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

MongoDB还支持for(i=0;i<100;i++)db.winner2.insert({x:i})这种形式的数据插入。

for(i=0;i<100;i++)db.winner2.insert({x:i})for(i=0;i<100;i++)db.winner2.insert({x:i})

> db.winner2.find()db.winner2.find()

"_id" : ObjectId("592bfaa425e6a2cd19372da3"), "x" : 0 }

"_id" : ObjectId("592bfaa425e6a2cd19372da4"), "x" : 1 }

"_id" : ObjectId("592bfaa425e6a2cd19372da5"), "x" : 2 }

"_id" : ObjectId("592bfaa425e6a2cd19372da6"), "x" : 3 }

"_id" : ObjectId("592bfaa425e6a2cd19372da7"), "x" : 4 }

"_id" : ObjectId("592bfaa425e6a2cd19372da8"), "x" : 5 }

"_id" : ObjectId("592bfaa425e6a2cd19372da9"), "x" : 6 }

"_id" : ObjectId("592bfaa425e6a2cd19372daa"), "x" : 7 }

"_id" : ObjectId("592bfaa425e6a2cd19372dab"), "x" : 8 }

"_id" : ObjectId("592bfaa425e6a2cd19372dac"), "x" : 9 }

"_id" : ObjectId("592bfaa425e6a2cd19372dad"), "x" : 10 }

"_id" : ObjectId("592bfaa425e6a2cd19372dae"), "x" : 11 }

"_id" : ObjectId("592bfaa425e6a2cd19372daf"), "x" : 12 }

"_id" : ObjectId("592bfaa425e6a2cd19372db0"), "x" : 13 }

"_id" : ObjectId("592bfaa425e6a2cd19372db1"), "x" : 14 }

"_id" : ObjectId("592bfaa425e6a2cd19372db2"), "x" : 15 }

"_id" : ObjectId("592bfaa425e6a2cd19372db3"), "x" : 16 }

"_id" : ObjectId("592bfaa425e6a2cd19372db4"), "x" : 17 }

"_id" : ObjectId("592bfaa425e6a2cd19372db5"), "x" : 18 }

#db.winner2.count() #统计数据条数 类似MySQL中的 select count(*) from tablename where *

100

2.3.3刪除數據

1、MySQL中刪除數據

 MySQL中刪除數據最常用的是delete結合where子句的方式,在清空表的時候可用truncate,delete不加限制條件時時刪除整個表的數據,但是當表中存在自增主鍵列時,新增加的數據主鍵自增列不會從初始化數字開始,而是從之前被刪除的位置繼續,而truncate是清空表,對整個表中的自增主鍵列重新初始化。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

mysql> select count(*)  from winer;

+----------+

| count(*) |

+----------+

|      160 |

+----------+

1 row in set (0.03 sec)

mysql> select *  from  winer limit 10;

+----+--------+-----+-----+

id | name   | age | sex |

+----+--------+-----+-----+

|  1 | MySQL  |  20 |   1 |

|  2 | MySQL  |  20 |   1 |

|  3 | Docker |   8 |   0 |

|  4 | MySQL  |  20 |   1 |

|  5 | Docker |   8 |   0 |

|  6 | MySQL  |  20 |   1 |

|  7 | MySQL  |  20 |   1 |

|  8 | Docker |   8 |   0 |

|  9 | MySQL  |  20 |   1 |

| 10 | Docker |   8 |   0 |

+----+--------+-----+-----+

10 rows in set (0.00 sec)

用delete删除全部数据

mysql> delete  from  winer;

Query OK, 160 rows affected (0.01 sec)

再插入数据

mysql> insert into winer (name,age,sex) select name,age,sex  from winner2;

Query OK, 5 rows affected (0.01 sec)

Records: 5  Duplicates: 0  Warnings: 0

#检查数据的主键情况,确实是从之前的删除前开始存储的,而并不是重新开始。

mysql> select * from winer;

+-----+--------+-----+-----+

id  | name   | age | sex |

+-----+--------+-----+-----+

| 249 | MySQL  |  20 |   1 |

| 250 | MySQL  |  20 |   1 |

| 251 | Docker |   8 |   0 |

| 252 | MySQL  |  20 |   1 |

| 253 | Docker |   8 |   0 |

+-----+--------+-----+-----+

5 rows in set (0.00 sec)

truncate 删除检查

 

mysql> truncate winer;

Query OK, 0 rows affected (0.09 sec)

 

mysql> insert into winer (name,age,sex) select name,age,sex  from winner2;

Query OK, 5 rows affected (0.01 sec)

Records: 5  Duplicates: 0  Warnings: 0

 

mysql> select * from winer;

+----+--------+-----+-----+

id | name   | age | sex |

+----+--------+-----+-----+

|  1 | MySQL  |  20 |   1 |

|  2 | MySQL  |  20 |   1 |

|  3 | Docker |   8 |   0 |

|  4 | MySQL  |  20 |   1 |

|  5 | Docker |   8 |   0 |

+----+--------+-----+-----+

5 rows in set (0.00 sec)

主键从1开始。

truncate 释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放

2、MongoDB中刪除數據

MongoDB remove()函數是用來移除集合中的數據。在執行remove()函數前先執行find()命令來判斷執行的條件是否正確,這是一個比較好的習慣。數據的刪除應該是一個很嚴謹的操作,不能隨意的操作,無論是MySQL還是MongoDB,或者其他的數據庫,我們都應該養成這樣的良好習慣。嚴格條件限制、備份、謹慎等。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

remove() 方法的基本语法格式如下所示:

db.collection.remove(

   <query>,

   <justOne>

)

MongoDB 是 2.6 版本以后的,语法格式如下:

db.collection.remove(

   <query>,

   {

     justOne: <boolean>,

     writeConcern: <document>

   }

)

参数说明:

query :(可选)删除的文档的条件。

justOne : (可选)如果设为 true 或 1,则只删除一个文档。

writeConcern :(可选)抛出异常的级别

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

根据筛选条件 删除部分数据

> db.winner.find()db.winner.find()

"_id" : ObjectId("592c2e01c070fc0df2f50f09"), "x" : 0 }

"_id" : ObjectId("592c2e01c070fc0df2f50f0b"), "x" : 2 }

"_id" : ObjectId("592c2e01c070fc0df2f50f0c"), "x" : 3 }

"_id" : ObjectId("592c2e01c070fc0df2f50f0d"), "x" : 4 }

"_id" : ObjectId("592c2e01c070fc0df2f50f0e"), "x" : 5 }

"_id" : ObjectId("592c2e01c070fc0df2f50f0f"), "x" : 6 }

"_id" : ObjectId("592c2e01c070fc0df2f50f10"), "x" : 7 }

"_id" : ObjectId("592c2e01c070fc0df2f50f11"), "x" : 8 }

"_id" : ObjectId("592c2e01c070fc0df2f50f12"), "x" : 9 }

"_id" : ObjectId("592c2e01c070fc0df2f50f13"), "x" : 10 }

"_id" : ObjectId("592c2e01c070fc0df2f50f14"), "x" : 11 }

"_id" : ObjectId("592c2e01c070fc0df2f50f15"), "x" : 12 }

"_id" : ObjectId("592c2e01c070fc0df2f50f16"), "x" : 13 }

"_id" : ObjectId("592c2e01c070fc0df2f50f17"), "x" : 14 }

"_id" : ObjectId("592c2e01c070fc0df2f50f18"), "x" : 15 }

"_id" : ObjectId("592c2e01c070fc0df2f50f19"), "x" : 16 }

"_id" : ObjectId("592c2e01c070fc0df2f50f1a"), "x" : 17 }

"_id" : ObjectId("592c2e01c070fc0df2f50f1b"), "x" : 18 }

"_id" : ObjectId("592c2e01c070fc0df2f50f1c"), "x" : 19 }

"_id" : ObjectId("592c2e01c070fc0df2f50f1d"), "x" : 20 }

Type "it" for more

> db.winnerdb.winne.remove({x:20})

 

> db.winedb.winne.find({x:20})

删除全部

 db.winner.remove()

 db.winner.find()

show tables;#检查集合  或者使用show  collections

system.indexes

win_collection

winer

winner

由于MongoDB里面的集合不像MySQL里面的表还有结构什么的,所以当我们删除所有数据时,可以直接

删除整个集合,当下次插入数据时,又会创建一个新的集合。

db.winner.drop()

for(i=0;i<100;i++)db.winner.insert({x:i})for(i=0;i<100;i++)db.winner.insert({x:i})

> db.winner.find()db.winner.find()

"_id" : ObjectId("592c34bd17c668d64f637dab"), "x" : 25 }

"_id" : ObjectId("592c34bd17c668d64f637dac"), "x" : 26 }

"_id" : ObjectId("592c34bd17c668d64f637dad"), "x" : 27 }

"_id" : ObjectId("592c34bd17c668d64f637dae"), "x" : 28 }

"_id" : ObjectId("592c34bd17c668d64f637daf"), "x" : 29 }

"_id" : ObjectId("592c34bd17c668d64f637db0"), "x" : 30 }

"_id" : ObjectId("592c34bd17c668d64f637db1"), "x" : 31 }

 

> db.winner.drop()

true

> db.winner.find()

> show tables;

system.indexes

win_collection

winer

经过对比,已经删除了之前的集合,但是这样的删除不会影响我们后面插入数据。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

删除重复文档中的一条文档

定义变量

SQLNAME=({"titile":"MongoDB学习实践",

description: "MongoDB是NoSQL数据库",

by:"书籍学习"})

增加数据:

>db.winner2.insert(SQLNAME)

>db.winner2.insert(SQLNAME)

>db.winner2.insert(SQLNAME)

>db.winner2.find() #检查所有的数据

"_id" : ObjectId("592c3628c1e073e087a335ee"), "titile" "MongoDB学习实践""description" "MongoDB是NoSQL数据库""by" "书籍学习" }

"_id" : ObjectId("592c362ac1e073e087a335ef"), "titile" "MongoDB学习实践""description" "MongoDB是NoSQL数据库""by" "书籍学习" }

"_id" : ObjectId("592c3639c1e073e087a335f0"), "titile" "MongoDB学习实践""description" "MongoDB是NoSQL数据库""by" "书籍学习" }

执行删除

db.winner2.remove({"titile" "MongoDB学习实践"})

再次检查 所有的结果全部删除 

db.winner2.find()

结合前面的语法

 

db.winner2.remove({"titile" "MongoDB学习实践"},1) 再查看数据只删除了其中的一部分

db.winner2.find()

"_id" : ObjectId("592c391b30de16129bcc9310"), "titile" "MongoDB学习实践""description" "MongoDB是NoSQL数据库""by" "书籍学习" }

"_id" : ObjectId("592c391c30de16129bcc9311"), "titile" "MongoDB学习实践""description" "MongoDB是NoSQL数据库""by" "书籍学习" }

2.3.4 更改数据

MySQL中更改数据主要通过update table  set  where之类的语句实现,做一个简单的示例,不做详细的描述。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

mysql> select * from  winner2;

+----+--------+-----+-----+

id | name   | age | sex |

+----+--------+-----+-----+

|  1 | MySQL  |  20 |   1 |

|  2 | MySQL  |  20 |   1 |

|  3 | Docker |   8 |   0 |

|  4 | MySQL  |  20 |   1 |

|  5 | Docker |   8 |   0 |

+----+--------+-----+-----+

5 rows in set (0.00 sec)

 

mysql> update  winner2   set name="MySQLDBA" where id=2; #将id为2的name更改为MySQLDBA

Query OK, 1 row affected (0.03 sec)

Rows matched: 1  Changed: 1  Warnings: 0

 

mysql> select * from  winner2;

+----+----------+-----+-----+

id | name     | age | sex |

+----+----------+-----+-----+

|  1 | MySQL    |  20 |   1 |

|  2 | MySQLDBA |  20 |   1 |

|  3 | Docker   |   8 |   0 |

|  4 | MySQL    |  20 |   1 |

|  5 | Docker   |   8 |   0 |

+----+----------+-----+-----+

5 rows in set (0.00 sec)

MongoDB中的数据更改也是通过update() 和 save() 实现的,需要注意的是,update()默认更改适合条件的一条文档记录。

 

 update() 和 save() 

update() 方法用于更新已存在的文档。语法格式如下:

1

2

3

4

5

6

7

8

9

db.collection.update(

   <query>,

   <update>,

   {

     upsert: <boolean>,

     multi: <boolean>,

     writeConcern: <document>

   }

)

參數說明:

query : update的查詢條件,類似sql update查詢內where後面的。

update : update的對象和一些更新的操作符(如$,$inc...)等,也可以理解為sql update查詢內set後面的

upsert : 可選,這個參數的意思是,如果不存在update的記錄,是否插入objNew,true為插入,默認是false,不插入。

multi : 可選,mongodb 默認是false,只更新找到的第一條記錄,如果這個參數為true,就把按條件查出來多條記錄全部更新。

writeConcern :可選,拋出異常的級別。

save() 方法

1

2

3

4

5

6

7

save() 方法通过传入的文档来替换已有文档。语法格式如下:

db.collection.save(

   <document>,

   {

     writeConcern: <document>

   }

)

参数说明:

document : 文档数据。

writeConcern :可选,抛出异常的级别。

更多实例

只更新第一条记录:

1

2

3

4

5

6

7

8

9

10

11

db.col.update( { "count" : { $gt : 1 } } , { $set : { "test2" "OK"} } );

全部更新:

db.col.update( { "count" : { $gt : 3 } } , { $set : { "test2" "OK"} },false,true );

只添加第一条:

db.col.update( { "count" : { $gt : 4 } } , { $set : { "test5" "OK"} },true,false );

全部添加加进去:

db.col.update( { "count" : { $gt : 5 } } , { $set : { "test5" "OK"} },true,true );

全部更新:

db.col.update( { "count" : { $gt : 15 } } , { $inc : { "count" : 1} },false,true );

只更新第一条记录:

db.col.update( { "count" : { $gt : 10 } } , { $inc : { "count" : 1} },false,false );

延伸阅读

    评论