互聯(lián)網(wǎng)行業(yè)的發(fā)展非常的迅速,數(shù)據(jù)存儲(chǔ)以及架構(gòu)優(yōu)化方面也有很多不同的解決方案,例如關(guān)系型數(shù)據(jù)庫(kù)、非關(guān)系型數(shù)據(jù)庫(kù)、數(shù)據(jù)倉(cāng)庫(kù)技術(shù)等。更多數(shù)據(jù)庫(kù)類產(chǎn)品的出現(xiàn),為我們很好的解決了數(shù)據(jù)存儲(chǔ)的問題,例如redis緩存,MySQL關(guān)系型數(shù)據(jù)庫(kù),MongoDB文檔型數(shù)據(jù)庫(kù),Hbase數(shù)據(jù)倉(cāng)庫(kù)等。
十多年品牌的成都網(wǎng)站建設(shè)公司,超過千家企業(yè)網(wǎng)站設(shè)計(jì)經(jīng)驗(yàn).價(jià)格合理,可準(zhǔn)確把握網(wǎng)頁(yè)設(shè)計(jì)訴求.提供定制網(wǎng)站建設(shè)、購(gòu)物商城網(wǎng)站建設(shè)、微信小程序開發(fā)、響應(yīng)式網(wǎng)站建設(shè)等服務(wù),我們?cè)O(shè)計(jì)的作品屢獲殊榮,是您值得信賴的專業(yè)網(wǎng)站建設(shè)公司。
隨著業(yè)務(wù)的發(fā)展,在對(duì)架構(gòu)優(yōu)化時(shí),選取了MongoDB存儲(chǔ)一部分?jǐn)?shù)據(jù),作為一個(gè)運(yùn)維人員只能迎頭趕上,去學(xué)習(xí)操作和維護(hù)相關(guān)知識(shí)。下面的文檔就是自己學(xué)習(xí)MongoDB數(shù)據(jù)庫(kù)的學(xué)習(xí)筆記,主要有以下特點(diǎn):
1、理論較少,主要是實(shí)際操作,
2、和關(guān)系型數(shù)據(jù)庫(kù)MySQL對(duì)比學(xué)習(xí),主要是一些操作方面。俗話說沒有對(duì)比,就沒有傷害,兩個(gè)不同類型的數(shù)據(jù)庫(kù)對(duì)比學(xué)習(xí),會(huì)更好的提高學(xué)習(xí)效率。
一、庫(kù)的操作
MySQL與MongoDB在 庫(kù)、表、數(shù)據(jù)等概念上有以下差異,MySQL中有數(shù)據(jù)庫(kù)Database,表 table,數(shù)據(jù)行列等概念,而MongoDB中沒有表和行列等概念,主要包含數(shù)據(jù)庫(kù)Database,集合collections,以及文檔。
RDBMS vs NOSQL
RDBMS
- 高度組織化結(jié)構(gòu)化數(shù)據(jù)
- 結(jié)構(gòu)化查詢語(yǔ)言(SQL) (SQL)
- 數(shù)據(jù)和關(guān)系都存儲(chǔ)在單獨(dú)的表中。
- 數(shù)據(jù)操縱語(yǔ)言,數(shù)據(jù)定義語(yǔ)言
- 嚴(yán)格的一致性
- 基礎(chǔ)事務(wù)
NoSQL
- 代表著不僅僅是SQL
- 沒有聲明性查詢語(yǔ)言
- 沒有預(yù)定義的模式
-鍵 - 值對(duì)存儲(chǔ),列存儲(chǔ),文檔存儲(chǔ),圖形數(shù)據(jù)庫(kù)
- 最終一致性,而非ACID屬性
- 非結(jié)構(gòu)化和不可預(yù)知的數(shù)據(jù)
- CAP定理
- 高性能,高可用性和可伸縮性
1.1 查看所有數(shù)據(jù)庫(kù)(已經(jīng)存在)
#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 查看當(dāng)前數(shù)據(jù)庫(kù) 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
注意事項(xiàng):
在MongoDB里面,連接數(shù)據(jù)庫(kù)服務(wù)端時(shí),在不指定數(shù)據(jù)庫(kù)名時(shí)。默認(rèn)test庫(kù),而MySQL默認(rèn)是空,當(dāng)我們切換到具體數(shù)據(jù)庫(kù)時(shí),才能看到具體的當(dāng)前數(shù)據(jù)庫(kù)信息。
1.2切換數(shù)據(jù)庫(kù)
在切換數(shù)據(jù)庫(kù)時(shí),命令都是使用use + 庫(kù)名,但是兩者之間還是有比較大的區(qū)別,MongoDB中,如果沒有輸入的庫(kù)名,它會(huì)創(chuàng)建一個(gè)庫(kù)名,而MySQL在所有當(dāng)前庫(kù)中,沒有你輸入的數(shù)據(jù)庫(kù)名時(shí),會(huì)報(bào)錯(cuò)。
> 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創(chuàng)建數(shù)據(jù)庫(kù)
MongoDB沒有具體的創(chuàng)建數(shù)據(jù)庫(kù)的命令,一般在切換的過程中,如果不存在該數(shù)據(jù)庫(kù),就會(huì)新建數(shù)據(jù)庫(kù),而MySQL中有create database databasename語(yǔ)句創(chuàng)建數(shù)據(jù)庫(kù)。
mysql> use win; ERROR 1049 (42000): Unknown database 'win' #未創(chuàng)建前 mysql> create database win; #創(chuàng)建語(yǔ)句 一般我們創(chuàng)建時(shí) 還會(huì)指定字符集什么的 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 如果數(shù)據(jù)庫(kù)不存在,則創(chuàng)建數(shù)據(jù)庫(kù),否則切換到指定數(shù)據(jù)庫(kù)。
1.4 刪除數(shù)據(jù)庫(kù)
剛學(xué)完創(chuàng)建和切換,創(chuàng)建后,我們又不想要它了,所以我們考慮一下如何刪除呢???MongoDB中用db.dropDatabase()刪除當(dāng)前庫(kù),而MySQL中使用 drop database databasename;刪除你要?jiǎng)h除的庫(kù)。
MySQL mysql> create database winner2; #創(chuàng)建庫(kù) Query OK, 1 row affected (0.00 sec) mysql> use winner2; #切換庫(kù) Database changed mysql> select database(); #查看當(dāng)前庫(kù) +------------+ | 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(); #查看當(dāng)前庫(kù) +------------+ | database() | +------------+ | NULL | +------------+ 1 row in set (0.00 sec) MongoDB use winner2 #創(chuàng)建winner庫(kù) switched to db winner2 show dbs;#查看當(dāng)前所有的庫(kù) col 0.203125GB winner2 0.203125GB db #查看當(dāng)前庫(kù) winner2 MySQL中刪除某個(gè)當(dāng)前庫(kù)后,再次查看當(dāng)前庫(kù)是NULL,而MongoDB中刪除當(dāng)前庫(kù)后,仍然顯示當(dāng)前庫(kù) db.dropDatabase() #刪除當(dāng)前庫(kù) { "dropped" : "winner2", "ok" : 1 } > db 檢查當(dāng)前庫(kù) winner2 show dbs#檢查所有的庫(kù) col 0.203125GB >
2、表與集合操作
在我們學(xué)習(xí)過數(shù)據(jù)庫(kù)相關(guān)理論知識(shí)后,我們都知道數(shù)據(jù)是存儲(chǔ)在表中,而數(shù)據(jù)庫(kù)是用來存儲(chǔ)數(shù)據(jù)表的。而MongoDB和MySQL的表概念是不一樣的,MongoDB是將文檔數(shù)據(jù)存儲(chǔ)在集合(collection)中,而MySQL是將數(shù)據(jù)存儲(chǔ)在表(table)中,集合是沒有表的結(jié)構(gòu)的,而表是有相關(guān)的結(jié)構(gòu),例如字段、字段類型、索引、主鍵、存儲(chǔ)引擎等。
2.1 查看當(dāng)前所有表
#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 創(chuàng)建表或者集合
MySQL數(shù)據(jù)是存儲(chǔ)在相關(guān)的表中,而MongoDB數(shù)據(jù)是存儲(chǔ)在集合中,MySQL由于支持插件式存儲(chǔ)引擎,字段類型、索引、主鍵、等原因,讓其創(chuàng)建表結(jié)構(gòu)的語(yǔ)句比較復(fù)雜,在應(yīng)用系統(tǒng)中,性能優(yōu)化等情況和表結(jié)構(gòu)息息相關(guān)。而MongoDB主要是用來存儲(chǔ)key(values)類型的數(shù)據(jù),所以要簡(jiǎn)單很多。
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創(chuàng)建集合 在MongoDB中,要操作一個(gè)集合,并不需要先創(chuàng)建它??梢灾苯油侠锩娌迦霐?shù)據(jù),如果集合不存在, 會(huì)自動(dòng)創(chuàng)建集合,并插入數(shù)據(jù)。
2.3 表與集合的增刪改查
在知道了如何創(chuàng)建一個(gè)表、集合等相關(guān)知識(shí)后,我們就要想著如何對(duì)表或者集合數(shù)據(jù)做修改,而我們的應(yīng)用系統(tǒng)、業(yè)務(wù)系統(tǒng)中存儲(chǔ)的數(shù)據(jù)主要就是增刪改查等相關(guān)的操作。
2.3.1插入數(shù)據(jù)
MySQL中插入數(shù)據(jù)
創(chuàng)建表SQL語(yǔ)句
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 表結(jié)構(gòu) 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、插入單條數(shù)據(jù)
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、批量插入
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 兩個(gè)插入語(yǔ)句之間區(qū)別value和values兩者都能插入單個(gè)值或者批量值 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、其他插入數(shù)據(jù)的方法
MySQL中除了傳統(tǒng)的insert into插入數(shù)據(jù)外,我們還可以用load data mysqlimport等方式導(dǎo)入數(shù)據(jù),也可以將其他表中的數(shù)據(jù)插入到某張表中,具體方法不做詳細(xì)描述。
2.3.2 MongoDB中插入數(shù)據(jù)
MongoDB主要存儲(chǔ)的是文檔數(shù)據(jù),文檔的數(shù)據(jù)結(jié)構(gòu)和JSON基本一樣。所有存儲(chǔ)在集合中的數(shù)據(jù)都是BSON格式。BSON是一種類json的一種二進(jìn)制形式的存儲(chǔ)格式,簡(jiǎn)稱Binary JSON。
插入文檔
MongoDB 使用 insert() 或 save() 方法向集合中插入文檔,語(yǔ)法如下:
db.COLLECTION_NAME.insert(document) db.COLLECTION_NAME.save(document)
1、簡(jiǎn)單的插入
db.winner.find() #插入前 MongoDB中用find查看以前的數(shù)據(jù)類似mysql中的select > db.winner.insert({name:"linux"}) #插入結(jié)果 >db.winner.find() { "_id" : ObjectId("592bf6bf1b8e279c43cbb021"), "name" : "linux" } >
2、定義變量
> SQLNAME=({"titile":"MongoDB學(xué)習(xí)實(shí)踐", description: "MongoDB是NoSql數(shù)據(jù)庫(kù)", by:"書籍學(xué)習(xí)"}) 可以將我們要插入的數(shù)據(jù)定義成變量,后面使用加載變量的方式來實(shí)現(xiàn)數(shù)據(jù)的插入 > db.sql.insert(SQLNAME) > db.sql.find() { "_id" : ObjectId("592bf8b5f3fed7ab45761fc1"), "titile" : "MongoDB學(xué)習(xí)實(shí)踐", "description" : "MongoDB是NoSQL數(shù)據(jù)庫(kù)", "by" : "書籍學(xué)習(xí)" } >
3、for循環(huán)插入
MongoDB還支持for(i=0;i<100;i++)db.winner2.insert({x:i})這種形式的數(shù)據(jù)插入。 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() #統(tǒng)計(jì)數(shù)據(jù)條數(shù) 類似MySQL中的 select count(*) from tablename where * 100
2.3.3刪除數(shù)據(jù)
1、MySQL中刪除數(shù)據(jù)
MySQL中刪除數(shù)據(jù)最常用的是delete結(jié)合where子句的方式,在清空表的時(shí)候可用truncate,delete不加限制條件時(shí)時(shí)刪除整個(gè)表的數(shù)據(jù),但是當(dāng)表中存在自增主鍵列時(shí),新增加的數(shù)據(jù)主鍵自增列不會(huì)從初始化數(shù)字開始,而是從之前被刪除的位置繼續(xù),而truncate是清空表,對(duì)整個(gè)表中的自增主鍵列重新初始化。
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刪除全部數(shù)據(jù) mysql> delete from winer; Query OK, 160 rows affected (0.01 sec) 再插入數(shù)據(jù) 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 #檢查數(shù)據(jù)的主鍵情況,確實(shí)是從之前的刪除前開始存儲(chǔ)的,而并不是重新開始。 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 釋放存儲(chǔ)表數(shù)據(jù)所用的數(shù)據(jù)頁(yè)來刪除數(shù)據(jù),并且只在事務(wù)日志中記錄頁(yè)的釋放
2、MongoDB中刪除數(shù)據(jù)
MongoDB remove()函數(shù)是用來移除集合中的數(shù)據(jù)。在執(zhí)行remove()函數(shù)前先執(zhí)行find()命令來判斷執(zhí)行的條件是否正確,這是一個(gè)比較好的習(xí)慣。數(shù)據(jù)的刪除應(yīng)該是一個(gè)很嚴(yán)謹(jǐn)?shù)牟僮?,不能隨意的操作,無(wú)論是MySQL還是MongoDB,或者其他的數(shù)據(jù)庫(kù),我們都應(yīng)該養(yǎng)成這樣的良好習(xí)慣。嚴(yán)格條件限制、備份、謹(jǐn)慎等。
remove() 方法的基本語(yǔ)法格式如下所示: db.collection.remove(, ) MongoDB 是 2.6 版本以后的,語(yǔ)法格式如下: db.collection.remove( , { justOne: , writeConcern: } ) 參數(shù)說明: query :(可選)刪除的文檔的條件。 justOne : (可選)如果設(shè)為 true 或 1,則只刪除一個(gè)文檔。 writeConcern :(可選)拋出異常的級(jí)別
根據(jù)篩選條件 刪除部分?jǐn)?shù)據(jù) > 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里面的表還有結(jié)構(gòu)什么的,所以當(dāng)我們刪除所有數(shù)據(jù)時(shí),可以直接 刪除整個(gè)集合,當(dāng)下次插入數(shù)據(jù)時(shí),又會(huì)創(chuàng)建一個(gè)新的集合。 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 經(jīng)過對(duì)比,已經(jīng)刪除了之前的集合,但是這樣的刪除不會(huì)影響我們后面插入數(shù)據(jù)。
刪除重復(fù)文檔中的一條文檔 定義變量 SQLNAME=({"titile":"MongoDB學(xué)習(xí)實(shí)踐", description: "MongoDB是NoSQL數(shù)據(jù)庫(kù)", by:"書籍學(xué)習(xí)"}) 增加數(shù)據(jù): >db.winner2.insert(SQLNAME) >db.winner2.insert(SQLNAME) >db.winner2.insert(SQLNAME) >db.winner2.find() #檢查所有的數(shù)據(jù) { "_id" : ObjectId("592c3628c1e073e087a335ee"), "titile" : "MongoDB學(xué)習(xí)實(shí)踐", "description" : "MongoDB是NoSQL數(shù)據(jù)庫(kù)", "by" : "書籍學(xué)習(xí)" } { "_id" : ObjectId("592c362ac1e073e087a335ef"), "titile" : "MongoDB學(xué)習(xí)實(shí)踐", "description" : "MongoDB是NoSQL數(shù)據(jù)庫(kù)", "by" : "書籍學(xué)習(xí)" } { "_id" : ObjectId("592c3639c1e073e087a335f0"), "titile" : "MongoDB學(xué)習(xí)實(shí)踐", "description" : "MongoDB是NoSQL數(shù)據(jù)庫(kù)", "by" : "書籍學(xué)習(xí)" } > 執(zhí)行刪除 db.winner2.remove({"titile" : "MongoDB學(xué)習(xí)實(shí)踐"}) 再次檢查 所有的結(jié)果全部刪除 db.winner2.find() > 結(jié)合前面的語(yǔ)法 db.winner2.remove({"titile" : "MongoDB學(xué)習(xí)實(shí)踐"},1) 再查看數(shù)據(jù)只刪除了其中的一部分 db.winner2.find() { "_id" : ObjectId("592c391b30de16129bcc9310"), "titile" : "MongoDB學(xué)習(xí)實(shí)踐", "description" : "MongoDB是NoSQL數(shù)據(jù)庫(kù)", "by" : "書籍學(xué)習(xí)" } { "_id" : ObjectId("592c391c30de16129bcc9311"), "titile" : "MongoDB學(xué)習(xí)實(shí)踐", "description" : "MongoDB是NoSQL數(shù)據(jù)庫(kù)", "by" : "書籍學(xué)習(xí)" }
2.3.4 更改數(shù)據(jù)
MySQL中更改數(shù)據(jù)主要通過update table set where之類的語(yǔ)句實(shí)現(xiàn),做一個(gè)簡(jiǎn)單的示例,不做詳細(xì)的描述。
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中的數(shù)據(jù)更改也是通過update() 和 save() 實(shí)現(xiàn)的,需要注意的是,update()默認(rèn)更改適合條件的一條文檔記錄。
update() 和 save()
update() 方法用于更新已存在的文檔。語(yǔ)法格式如下:
db.collection.update(, , { upsert: , multi: , writeConcern: } )
參數(shù)說明:
query : update的查詢條件,類似sql update查詢內(nèi)where后面的。
update : update的對(duì)象和一些更新的操作符(如$,$inc...)等,也可以理解為sql update查詢內(nèi)set后面的
upsert : 可選,這個(gè)參數(shù)的意思是,如果不存在update的記錄,是否插入objNew,true為插入,默認(rèn)是false,不插入。
multi : 可選,mongodb 默認(rèn)是false,只更新找到的第一條記錄,如果這個(gè)參數(shù)為true,就把按條件查出來多條記錄全部更新。
writeConcern :可選,拋出異常的級(jí)別。
save() 方法
save() 方法通過傳入的文檔來替換已有文檔。語(yǔ)法格式如下: db.collection.save(, { writeConcern: } )
參數(shù)說明:
document : 文檔數(shù)據(jù)。
writeConcern :可選,拋出異常的級(jí)別。
更多實(shí)例
只更新第一條記錄:
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 ); 全部添加加進(jìn)去: 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 );