使用MongoDB操作文檔
本篇文章中將講解如何使用MongoDB操作文檔。
文檔的數據結構和JSON基本一致,所有存儲在集合中的數據都是BSON格式。BSON是一種類似json格式的一種二進制形式的存儲格式,簡稱Binary JSON。
一、插入文檔
MongoDB使用insert()或save()方法向集合中插入文檔,語法如下:
db.COLLECTION_NAME.insert(document)
例如:以下文檔可以存儲在MongoDB的test數據庫的MongoDBTest集合中:
{"title" : "MongoDB", "description" : "mongoDB是一個NoSql數據庫", "tags" : "NoSql" }
1、使用insert()方法插入文檔
在上面的例子中,MongoDBTest是我們的集合名,如果該集合不在該數據庫中,MongoDB會自動創建該集合並插入文檔。doc是定義的變量,可以以變量的形式插入集合。
查看已經插入的文檔:
> db.MongoDBTest.insert(doc) WriteResult({ "nInserted" : 1 }) > db.MongoDBTest.find() { "_id" : ObjectId("5a6f13e72d0b37669c5d2a78"), "title" : "MongoDB", "description" : "mongoDB是一個NoSql數據庫", "tags" : "NoSql" } >
2、使用save()方法插入文檔
插入文檔也可以使用save()方法。如果不知道_id字段save()方法類似於insert()方法。如果指定_id字段,則會更新該_id的數據。
下面的例子表示使用save()命令更新數據:
二、查詢文檔
MongoDB查詢文檔使用find()方法。
find()方法以非結構化的方式來顯示所有文檔。
1、語法
MongoDB查詢數據的語法格式如下:
db.collection.find(query,projection)
參數說明:
- query:可選參數,使用查詢操作符指定查詢條件。
- projection:可選參數,使用投影操作符指定返回的鍵。如果查詢時要返回文檔中所有鍵值,隻需省略該參數即可(默認省略)。
如果你需要格式化讀取的數據,可以使用pretty()方法,語法格式如下:
db.collection.find().pretty()
pretty()方法以格式化的方式來顯示所有文檔。
2、實例
例如:查詢Student集合中的所有文檔。
除瞭find()方法之外,還有一個findOne()方法,它隻返回一個文檔。
MongoDB與RDBMS where語句比較
如果你熟悉常規的SQL數據,通過下表可以更好的理解MongoDB的條件語句查詢:
操作 | 格式 | 范例 | RDBMS中的類似語句 |
等於 | {<key>:<value>} | db.Student.find({"name":"張三"}).pretty() | where name='張三' |
小於 | {<key>:{$lt:<value>}} | db.Student.find({"score":{$lt:"80"}}).pretty() | where score<80 |
小於或等於 | {<key>:{$lte:<value>}} | db.Student.find({"score":{$lte:"80"}}).pretty() | where score<=80 |
大於 | {<key>:{$gt:<value>}} | db.Student.find({"score":{$gt:"80"}}).pretty() | where score>80 |
大於或等於 | {<key>:{$gte:<value>}} | db.Student.find({"score":{$gte:"80"}}).pretty() | where score>=80 |
不等於 | {<key>:{$ne:<value>}} | db.Student.find({"score":{$ne:"80"}}).pretty() | where score!=80 |
(1)查詢name是張三的學生
db.Student.find({"name":"張三"}).pretty()
查詢結果如下圖所示:
(2)查詢成績小於80的學生
db.Student.find({"score":{$lt:"80"}}).pretty()
查詢結果如下圖所示:
(3)查詢成績小於等於80的學生
db.Student.find({"score":{$lte:"80"}}).pretty()
查詢結果如下圖所示:
(4)查詢成績大於80分的學生
db.Student.find({"score":{$gt:"80"}}).pretty()
(5)查詢成績大於等於80分的學生
db.Student.find({"score":{$gte:"80"}}).pretty()
查詢結果如下圖所示:
(6)查詢成績不等於80分的學生
db.Student.find({"score":{$ne:"80"}}).pretty()
查詢結果如下圖所示:
3、MongoDB AND條件查詢
MongoDB的find()方法可以傳入多個鍵(key),每個鍵(key)以逗號分隔開,等價於常規SQL的AND條件。
語法格式如下:
db.collection.find({key1:value1,key2:value2}).pretty()
例如:查詢姓名為張三並且課程是C#程序設計的學生信息。
db.Student.find({"name":"張三","subject":"C#程序設計"}).pretty()
查詢結果如下圖所示:
以上實例中類似於RDBMS中的where語句:WHERE name='張三' AND subject='C#程序設計'。
4、MongoDB OR 條件查詢
MongoDB的OR條件語句使用瞭關鍵字$or,語法格式如下:
>db.collection.find( { $or:[ {key1:value1},{key2:value2} ] } )
例如:查詢姓名是李四或者成績等於80的學生
db.Student.find({$or:[{"name":"李四"},{"score":"80"}]}).pretty()
查詢結果如下圖所示:
三、更新文檔
MongoDB使用update()和save()方法來更新集合中的文檔。接下來讓我們詳細來看下兩個方法的應用及其區別。
1、update()方法
update()方法用於更新已經存在的文檔。語法格式如下:
db.collection.update( <query>, <update>, { upsert:<boolean>, multi:<boolean>, writeConcern:<document> } )
參數說明:
- query:update的查詢條件,類似sql update查詢內where後面的條件。
- update:update的對象和一些更新的操作符(如$set,Sinc……)等,也可以理解為sql update查詢內set後面的。
- upsert:可選參數,這個參數的意思是:如果不存在update的記錄,是否插入新的文檔。如果為true則插入,默認是false不插入。
- multi:可選參數,MongoDB默認是false,隻更新找到的第一條記錄。如果這個參數為true,就把按條件查詢出來的多條記錄全部更新。
- writeConcern:可選參數,拋出異常的級別。
writeConcern的幾種拋出異常的級別參數
- writeConcern.NONE:沒有異常拋出。
- writeConcern.NORMAL:僅拋出網絡錯誤異常,沒有服務器錯誤異常拋出。
- writeConcern.SAFE:拋出網絡錯誤異常、服務器錯誤異常;並等待服務器完成寫操作。
- writeConcern.MAJORITY:拋出網絡錯誤異常、服務器錯誤異常;並等待一個主服務器完成寫操作。
- writeConcern.FSYNC_SAFE:拋出網絡錯誤異常、服務器錯誤異常;寫操作等待服務器將數據刷新到磁盤。
- writeConcern.JOURNAL_SAFE:拋出網絡錯誤異常、服務器錯誤異常;寫操作等待服務器提交到磁盤的日志文件。
- writeConcern.REPLICAS_SAFE:拋出網絡錯誤異常、服務器錯誤異常;等待至少2臺服務器完成寫操作。
例如:使用update()方法更新標題(title)
上面的語句隻會更新第一條查詢到的文檔,如果你要更新多條相同的文檔,則需要設置multi參數為true。
如果要更新的數據不存在,upsert參數設置為true則會插入數據。
2、save()方法
save()方法通過傳入的文檔來替換已有文檔,語法格式如下:
db.collection.save( <document>, { writeConcern:<document> } )
參數說明:
- document:要更新的文檔數據。
- writeConcern:可選參數,拋出異常的級別。
例如:更新_id=5a702a7f2c6ed8f4d3491831的文檔。
四、刪除文檔
MongoDB使用remove()方法來移除集合中的數據。
註意:在執行remove()方法前先執行find()命令來判斷執行的條件是否正確,這是一個比較好的習慣。
remove()方法的基本語法格式如下:
db.collection.remove( <query>, <justOne> )
如果MongoDB是2.6版本以後的,語法格式如下:
db.collection.remove( <query>, { justOne:<boolean>, writeConcern:<document> } )
參數說明:
- query:可選參數,刪除文檔的條件。
- justOne:可選參數,如果設為true或1,則隻刪除一個文檔。
- writeConcern:可選參數,拋出異常的級別。
實例
1、刪除title為MongoDB教程的文檔,隻刪除一個:
2、刪除所有數據
如果想刪除所有數據,可以使用下面的例子
到此這篇關於使用MongoDB操作文檔的文章就介紹到這瞭。希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。
推薦閱讀:
- MongoDB基礎之查詢文檔
- MongoDB 常用的crud操作語句
- MongoDB實現創建刪除數據庫、創建刪除表(集合 )、數據增刪改查
- 深入瞭解Python如何操作MongoDB
- MongoDB的常用命令匯總(Mongo4.2.8)