1. 程式人生 > 其它 >mongodb入門-1-基本概念及命令

mongodb入門-1-基本概念及命令

什麼是MongoDB

MongoDB是專為可擴充套件性,高效能和高可用性而設計的NoSQL資料庫。它可以從單伺服器部署擴充套件到大型、複雜的多資料中心架構。
利用記憶體計算的優勢,MongoDB能夠提供高效能的資料讀寫操作。 MongoDB的本地複製和自動故障轉移功能使您的應用程式具有企
業級的可靠性和操作靈活性。
官方網址:https://www.mongodb.com/
中文文件地址:https://docs.mongoing.com/
菜鳥教程:https://www.runoob.com/mongodb/mongodb-tutorial.html

簡單的說,MongoDB是一種文件型資料庫,記錄資料的格式類似於JSON,但比JSON更加的強大。

安裝

基本的安裝,下載tar檔案,解壓+配置PATH+啟動,在這裡不再贅述。
若只想熟悉命令,也可直接訪問shell:https://www.mongodb.com/docs/v4.2/tutorial/getting-started/#mongo-web-shell 進行學習;

基本概念

基本命令

//資料庫的建立與刪除
資料庫沒有顯示的建立,隨著資料的灌入而建立
show dbs
use [database]
db.[dbname].insert({"a":"b"})
db.[dbname].dropDatabase()

建立集合

db.[db].createCollection("myCollection")

db.createCollection("collectionName",{options})

options如下:

刪除集合

db.[myCollection].drop()

插入文件

MongoDB中的文件和JSON基本一樣,所有資料都是BSON格式,BSON即Binary JSON簡稱。

db.COLLECTION_NAME.insertOne(document)
db.COLLECTION_NAME.insertMany([d1,d2])
db.COLLECTION_NAME.insert(document)

查詢:
db.COLLECTION_NAME.find()

更新文件

MDB使用update和save更新文件

update()

語法:
db.COLLECTION_NAME.update({"targetField":"targetVal"},{$set:{"updated":"updatedVal"}})
記住一條,所有的表示式需要符合BSON標準

在我操作過程中報如下錯誤:

這是因為我之前的集合被設定成了固定集合,固定集合的資料不能修改,只能查詢-刪除-再插入。

以上語句只會更新第一條資料,如果需要更新多個,則需要將multi設定為true

save()


通過save儲存的document,會自動更新同ObjectID的文件。

如果需要更新年齡大於18的,使用如下命令。

刪除文件

刪除使用的是remove函式,語法如下:

示例:

如果想刪除當下所有的資料,使用如下命令
db.COLLECTION_NAME.remove({}),類似於MYSQL的truncate

查詢文件

AND

多個條件,使用逗號分割,如下:

如圖所示,查詢結果不符合預期,以下寫法才正確:

及AND條件,若出現了同樣的KEY,後面的會覆蓋之前的。

OR

OR的條件,通過$or指定(注意只能小寫),後面是一個數組,如下:
若要查詢age=21或者20的資料,則:

OR和AND的聯用:
若要查詢name=mike,age為21或22的,語句如下:

截止目前,我們調整的都是query的引數,find還有一個引數projection,調整的是查詢到資料之後的返回策略。

db.collection.find(query, projection)
若不指定 projection,則預設返回所有鍵,指定 projection 格式如下,有兩種模式

db.collection.find(query, {title: 1, by: 1}) // inclusion模式 指定返回的鍵,不返回其他鍵
db.collection.find(query, {title: 0, by: 0}) // exclusion模式 指定不返回的鍵,返回其他鍵

除了_id欄位,其餘的欄位都需要有統一的返回策略,

  • 如title指定1,即只指定title返回,其餘需要返回的欄位需要單獨指定1,否則預設不返回。
  • 若title指定0,則只有title隱藏,其餘需要隱藏的欄位也需要指定0,否則預設都返回
  • 針對_id欄位,其1就是返回,0就是隱藏,若不指定,預設都返回。
    普通欄位不能同時有0和1,否則會報錯如下:

條件操作符

上文中,或多或少我們已經接觸了$xx的使用。MDB中常用的條件操作符如下:

  • (>) 大於 - $gt
  • (<) 小於 - $lt
  • (>=) 大於等於 - $gte
  • (<= ) 小於等於 - $lte
  • (!= ) 不等於 - $ne
  • (== ) 等於 - $eq

模糊匹配

type操作符

按照type去取值,基本用法即$type, type對應的表如下:

Limit與Skip的用法

limit類似與MYSQL中的功能,指定數量的返回

skip則類似於MYSQL中的offset,跳過指定數量

類似於MYSQL中LIMIT OFFSET在大數量級的效率問題 MDB中也會有同樣的問題,實際使用中,建議通過where先定位記錄,再使用limit,而不要使用skip。

最後,通過一個例子來加深一下limit和skip的使用:

> var arr = [];
>
> for(var i=1 ; i<=20000 ; i++){
...     arr.push({num:i});
... }
20000
>
> db.numbers.insert(arr);
BulkWriteResult({
	"writeErrors" : [ ],
	"writeConcernErrors" : [ ],
	"nInserted" : 20000,
	"nUpserted" : 0,
	"nMatched" : 0,
	"nModified" : 0,
	"nRemoved" : 0,
	"upserted" : [ ]
})
> db.numbers.find({$and:[{"num":{$lt:60}},{"num":{$gt:45}}]}).limit(7).skip(5);
{ "_id" : ObjectId("623edd97777c8dcc447b4953"), "num" : 51 }
{ "_id" : ObjectId("623edd97777c8dcc447b4954"), "num" : 52 }
{ "_id" : ObjectId("623edd97777c8dcc447b4955"), "num" : 53 }
{ "_id" : ObjectId("623edd97777c8dcc447b4956"), "num" : 54 }
{ "_id" : ObjectId("623edd97777c8dcc447b4957"), "num" : 55 }
{ "_id" : ObjectId("623edd97777c8dcc447b4958"), "num" : 56 }
{ "_id" : ObjectId("623edd97777c8dcc447b4959"), "num" : 57 }
>