MongoDB 是由C++語言編寫的,是一個基於分佈式文件存儲的開源數據庫系統。MongoDB 將數據存儲爲一個文檔,數據結構由鍵值(key=>value)對組成。MongoDB 文檔相似於 JSON 對象。字段值能夠包含其餘文檔,數組及文檔數組。mongodb
MongoDB 提供了可用於 32 位和 64 位系統的預編譯二進制包,你能夠從MongoDB官網下載安裝,MongoDB 預編譯二進制包下載地址: www.mongodb.com/download-ce…數據庫
個人MongoDB是安裝在D:\mongodb目錄下,安裝好後,進入到安裝目錄D:\mongodb\data下,新建一個數據庫目錄,例如dbjson
打開命令行工具,這裏我推薦一下Cmder命令行工具,我一直在用,打開後,輸入D:\mongodb\bin\mongod --dbpath D:\mongodb\data\db
回車執行數組
配置了bin目錄的Path路徑,能夠直接用mongod命令啓動服務器,執行mongod --dbpath D:\mongodb\data\db
或者在data目錄下執行mongod --dbpath .\db
bash
爲了啓動mongodb方便,將mongod.exe路徑加入環境變量,位置:計算機->屬性->高級系統設置->環境變量,在系統變量的Path裏,在末尾加上安裝MongoDB的bin目錄,記得加英文分號‘;’。所有肯定保存後,從新打開命令行窗口,就能夠在任何地方都能用到mongod命令以及bin目錄下的其餘命令了服務器
在以前啓動了服務器後,千萬不要關閉服務端的命令行窗口,須要再從新打開一個命令行窗口,在任意目錄下輸入mongo便可啓動客戶端(若是遇到「'mongo'不是內部或外部命令,也不是可運行的程序或批處理文件。」,請配置上面的Path路徑);若是你就是不想配置Path路徑,那你直接到你安裝目錄的bin目錄下,雙擊mongo.exe打開也能直接鏈接客戶端數據結構
在mongodb中基本的概念是文檔、集合、數據庫分佈式
show collections
,能夠查看當前數據庫實例下的所有集合db.collection.find()
命令,能夠查看collection集合下的所有文檔初次鏈接客戶端,使用db查看,默認使用的是test數據庫,再使用show dbs查看所有數據庫,並使用use命令切換數據庫,例如使用use admin切換到admin數據庫工具
> db
test
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
school 0.000GB
test 0.000GB
> use admin
switched to db admin
複製代碼
新建數據庫的語法爲:use databaseName
,也就是和切換數據庫是同樣的,若是切換的數據庫不存在,則建立新的數據庫,例如須要使用use order
新建一個數據庫order,可是使用show dbs
查看並無發現新建的數據庫,也就是空集合的數據庫不會顯示出來,則須要向order中隨便插入一個文檔就能看到了,例如咱們執行db.info.insert({'name':'張三','note':'hello world'})
向info集合中插入一條文檔,再使用show dbs
就能看到order數據庫了ui
> use order
switched to db order
> db
order
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
school 0.000GB
test 0.000GB
> db.info.insert({'name':'張三','note':'hello world'})
WriteResult({ "nInserted" : 1 })
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
order 0.000GB
school 0.000GB
test 0.000GB
複製代碼
可使用db.dropDatabase()
刪除當前數據庫,再使用show dbs
查看當前數據庫是否刪除,能夠看到school已經不存在了(好奇的人,這時候也許會問:我在當前數據庫下刪除其餘數據庫能夠嗎?我試了下,好像不行,報錯了……)
> use school
switched to db school
> db
school
> db.dropDatabase()
{ "dropped" : "school", "ok" : 1 }
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
order 0.000GB
test 0.000GB
複製代碼
建立集合的語法爲db.createCollection(name, options)
,第一個參數name是必傳的集合名,第二個options是指定有關內存大小及索引的選項的可選參數,例如,咱們使用命令db.createCollection('goods')
在order數據庫下新建一個goods集合,而後使用show collections
或show tables
命令查看該數據庫下的文檔
> use order
switched to db order
> db.createCollection('goods')
{ "ok" : 1 }
> show collections
goods
info
> show tables
goods
info
複製代碼
固然是能夠的,其實在MongoDB中,咱們不須要先建立集合,由於當你插入文檔後,MongoDB會自動建立該集合,例如,咱們使用db.user.insert({'name':'lisan','age':23,'sex':'w'})
在order數據庫中建立user集合並插入一條文檔
> show tables
goods
info
> db.user.insert({'name':'lisan','age':23,'sex':'w'})
WriteResult({ "nInserted" : 1 })
> show collections
goods
info
user
複製代碼
建立了集合,那麼確定就須要刪除多餘的集合,刪除集合的語法爲db.collectionName.drop()
,例如,咱們使用db.user.drop()
刪除剛剛建立的user集合
> db.user.drop()
true
> show collections
goods
info
複製代碼
友情幫助:對了,可使用db.collectionName.help()
查看集合的幫助,例如:db.goods.help()
MongoDB使用insert()方法向集合中插入文檔,語法爲db.collectionName.insert(document)
,例如使用db.goods.insert({'name':'商品名稱','price':123,'sale':6})
向goods集合中插入一條數據(當咱們插入一條文檔的時MongoDB會自動爲此文檔生成一個_id屬性,且_id的值必定是惟一的,默認爲objectId())
> db.goods.insert({'name':'商品名稱','price':123,'sale':6})
WriteResult({ "nInserted" : 1 })
複製代碼
插入文檔,仍是可使用db.collectionName.insertOne(document)
插入一條或者使用db.collectionName.insertMany(document)
插入多條,insertOne()的使用和insert()同樣的,document都是一個json對象;insertMany()插入多條時,document是多個json對象的數組,示例以下:
> db.goods.insertOne({'name':'商品名稱6','price':19,'sale':9}))))
"acknowledged" : true,
"insertedId" : ObjectId("5e953450aabbbfa8f930a967")
}
> db.goods.insertMany([{'name':'商品名稱88','price':18,'sale':1},{'name':'商品名稱99','price':99,'sale':99}])))
"acknowledged" : true,
"insertedIds" : [
ObjectId("5e953475aabbbfa8f930a968"),
ObjectId("5e953475aabbbfa8f930a969")
]
}
複製代碼
另外,插入文檔也可使用db.collectionName.save(document)
命令。若是不指定_id字段save()方法相似於insert()方法。若是指定_id字段,則會更新該_id的數據。
MongoDB使用update()方法來更新集合中的文檔,語法以下:
db.collectionName.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
複製代碼
前面,咱們再goods集合中插入了一條{'name':'商品名稱6','price':19,'sale':9}
的文檔,如今咱們更新這個文檔,把名稱 name=商品名稱6 的價格 price 改成91,則更新命令爲db.goods.update({'name':'商品名稱6'}, {$set:{'price':91}})
,更新先後對比發現確實變了
> db.goods.find()
{ "_id" : ObjectId("5e95322caabbbfa8f930a965"), "name" : "商品名稱", "price" : 123, "sale" : 6 }
{ "_id" : ObjectId("5e95340faabbbfa8f930a966"), "name" : "商品名稱1", "price" : 19.99, "sale" : 8 }
{ "_id" : ObjectId("5e953450aabbbfa8f930a967"), "name" : "商品名稱6", "price" : 19, "sale" : 9 }
{ "_id" : ObjectId("5e953475aabbbfa8f930a968"), "name" : "商品名稱88", "price" : 18, "sale" : 1 }
{ "_id" : ObjectId("5e953475aabbbfa8f930a969"), "name" : "商品名稱99", "price" : 99, "sale" : 99 }
> db.goods.update({'name':'商品名稱6'}, {$set:{'price':91}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.goods.find() 1}})
{ "_id" : ObjectId("5e95322caabbbfa8f930a965"), "name" : "商品名稱", "price" : 123, "sale" : 6 }
{ "_id" : ObjectId("5e95340faabbbfa8f930a966"), "name" : "商品名稱1", "price" : 19.99, "sale" : 8 }
{ "_id" : ObjectId("5e953450aabbbfa8f930a967"), "name" : "商品名稱6", "price" : 91, "sale" : 9 }
{ "_id" : ObjectId("5e953475aabbbfa8f930a968"), "name" : "商品名稱88", "price" : 18, "sale" : 1 }
{ "_id" : ObjectId("5e953475aabbbfa8f930a969"), "name" : "商品名稱99", "price" : 99, "sale" : 99 }
複製代碼
也能夠經過save()方法經過傳入的文檔來替換已有文檔,必須傳入_id的值
上面的update命令中,可能你會問$set那個是什麼意思呢?這是操做符,用來指定設置文檔某字段的值,還有其餘不少更新操做符,下面大概列一下:
另外,update()默認只會更新符合條件的第一條數據,若是須要所有更新,則須要指定multi的值爲true,例以下面的數據,我提早把兩條文檔的price改成18,而後把這兩條文檔的name改成「商品名稱相同」,能夠看到執行一次,兩條數據都變了
> db.goods.find() e}})
{ "_id" : ObjectId("5e95322caabbbfa8f930a965"), "name" : "商品名稱", "price" : 123, "sale" : 6 }
{ "_id" : ObjectId("5e95340faabbbfa8f930a966"), "name" : "商品名稱1", "price" : 19.99, "sale" : 8 }
{ "_id" : ObjectId("5e953450aabbbfa8f930a967"), "name" : "商品名稱6", "price" : 18, "sale" : 9 }
{ "_id" : ObjectId("5e953475aabbbfa8f930a968"), "name" : "商品名稱88", "price" : 18, "sale" : 1 }
{ "_id" : ObjectId("5e953475aabbbfa8f930a969"), "name" : "商品名稱99", "price" : 99, "sale" : 99 }
> db.goods.update({'price':18}, {$set:{'name':'商品名稱相同'}}, {multi: true})
WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })
> db.goods.find() true})
{ "_id" : ObjectId("5e95322caabbbfa8f930a965"), "name" : "商品名稱", "price" : 123, "sale" : 6 }
{ "_id" : ObjectId("5e95340faabbbfa8f930a966"), "name" : "商品名稱1", "price" : 19.99, "sale" : 8 }
{ "_id" : ObjectId("5e953450aabbbfa8f930a967"), "name" : "商品名稱相同", "price" : 18, "sale" : 9 }
{ "_id" : ObjectId("5e953475aabbbfa8f930a968"), "name" : "商品名稱相同", "price" : 18, "sale" : 1 }
{ "_id" : ObjectId("5e953475aabbbfa8f930a969"), "name" : "商品名稱99", "price" : 99, "sale" : 99 }
複製代碼
還有,在3.2版本開始,MongoDB還提供了db.collectionName.updateOne()
更新一個文檔,db.collectionName.updateMany()
更新多個文檔,更新單個和update相同,傳入前兩個參數便可,使用updateMany()更新多個更加方便,沒必要傳入multi爲true了
MongoDB使用remove()來移除文檔,其語法以下
db.collectionName.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)
複製代碼
咱們使用remove()來移除goods集合中 name=商品名稱 的文檔,其命令爲db.goods.remove({'goods': '商品名稱'})
> db.goods.remove({'name': '商品名稱'}))
WriteResult({ "nRemoved" : 1 })
> db.goods.find()
{ "_id" : ObjectId("5e95340faabbbfa8f930a966"), "name" : "商品名稱1", "price" : 19.99, "sale" : 8 }
{ "_id" : ObjectId("5e953450aabbbfa8f930a967"), "name" : "商品名稱相同", "price" : 18, "sale" : 9 }
{ "_id" : ObjectId("5e953475aabbbfa8f930a968"), "name" : "商品名稱相同", "price" : 18, "sale" : 1 }
{ "_id" : ObjectId("5e953475aabbbfa8f930a969"), "name" : "商品名稱99", "price" : 99, "sale" : 99 }
複製代碼
執行刪除操做的時候,默認是刪除全部符合條件的數據,若是你想刪除指定的最多條數,則在第二個參數傳入該限制數字:db.goods.remove({'goods': '商品名稱'}, 2)
,若是你想刪除集合的所有文檔傳入空對象便可,也就是db.goods.remove({})
remove()方法已通過時了,如今官方推薦使用 deleteOne()刪除單個文檔 和 delete;Many()刪除多個文檔,例如刪除多個的命令爲db.goods.deleteOne({'goods': '商品名稱'})
,刪除多個的命令爲db.goods.deleteMany({'goods': '商品名稱'})
MongoDB 查詢文檔使用 find() 方法,其語法爲db.collectionName.find(query, projection)
,兩個參數都是可選的(其中query是查詢條件,projection是返回字段),啥都不傳默認查詢所有文檔的所有字段 查找goods集合的所有文檔,命令爲db.goods.find()
> db.goods.find()
{ "_id" : ObjectId("5e95340faabbbfa8f930a966"), "name" : "商品名稱1", "price" : 19.99, "sale" : 8 }
{ "_id" : ObjectId("5e953450aabbbfa8f930a967"), "name" : "商品名稱相同", "price" : 18, "sale" : 9 }
{ "_id" : ObjectId("5e953475aabbbfa8f930a968"), "name" : "商品名稱相同", "price" : 18, "sale" : 1 }
{ "_id" : ObjectId("5e953475aabbbfa8f930a969"), "name" : "商品名稱99", "price" : 99, "sale" : 99 }
查找goods集合sale大於6的文檔,命令爲db.goods.find({'sale': {$gt: 6}})
> db.goods.find({'sale': {$gt: 6}})
{ "_id" : ObjectId("5e95340faabbbfa8f930a966"), "name" : "商品名稱1", "price" : 19.99, "sale" : 8 }
{ "_id" : ObjectId("5e953450aabbbfa8f930a967"), "name" : "商品名稱相同", "price" : 18, "sale" : 9 }
{ "_id" : ObjectId("5e953475aabbbfa8f930a969"), "name" : "商品名稱99", "price" : 99, "sale" : 99 }
查找goods集合sale大於6且price小於20的文檔,命令爲db.goods.find({'sale': {$gt: 6}, 'price': {$lt: 20}})
> db.goods.find({'sale': {$gt: 6}, 'price': {$lt: 20}})
{ "_id" : ObjectId("5e95340faabbbfa8f930a966"), "name" : "商品名稱1", "price" : 19.99, "sale" : 8 }
{ "_id" : ObjectId("5e953450aabbbfa8f930a967"), "name" : "商品名稱相同", "price" : 18, "sale" : 9 }
複製代碼
從上面的查詢命令中,可能有人會注意到,$gt或者$lt這是什麼意思呢,這是條件操做符,具體部分操做符以下:
另外,關於一些模糊查詢,MongoDB還支持正則匹配,語法爲:db.collectionName.find({key:/value/})
,例以下面的查詢
> db.goods.find({'name': /99/}))))
{ "_id" : ObjectId("5e953475aabbbfa8f930a969"), "name" : "商品名稱99", "price" : 99, "sale" : 99 }
> db.goods.find({'name': /相同$/}))
{ "_id" : ObjectId("5e953450aabbbfa8f930a967"), "name" : "商品名稱相同", "price" : 18, "sale" : 9 }
{ "_id" : ObjectId("5e953475aabbbfa8f930a968"), "name" : "商品名稱相同", "price" : 18, "sale" : 1 }
> db.goods.find({'name': /^商品/})
{ "_id" : ObjectId("5e95340faabbbfa8f930a966"), "name" : "商品名稱1", "price" : 19.99, "sale" : 8 }
{ "_id" : ObjectId("5e953450aabbbfa8f930a967"), "name" : "商品名稱相同", "price" : 18, "sale" : 9 }
{ "_id" : ObjectId("5e953475aabbbfa8f930a968"), "name" : "商品名稱相同", "price" : 18, "sale" : 1 }
{ "_id" : ObjectId("5e953475aabbbfa8f930a969"), "name" : "商品名稱99", "price" : 99, "sale" : 99 }
複製代碼
咱們知道find()查詢默認返回符合條件的所有文檔,若是想只查詢指定條數呢,這時候就須要用到limit()方法了,其語法爲db.collectionName.find().limit(number)
limit()是返回符合條件的前幾條數據,若是我想返回中間的幾條數據,該怎麼取?這時候一樣須要skip()方法來跳過指定數量的記錄數,其語法爲db.collectionName.find().limit(number).skip(number)
上面的goods集合中,咱們想跳過前三條獲取第四條name爲「商品名稱99」的數據,其命令爲db.goods.find().limit(1).skip(3)
> db.goods.find().limit(1).skip(3)
{ "_id" : ObjectId("5e953475aabbbfa8f930a969"), "name" : "商品名稱99", "price" : 99, "sale" : 99 }
複製代碼
在 MongoDB 中使用 sort() 方法對數據進行排序,sort() 方法能夠經過參數指定排序的字段,並使用 1 和 -1 來指定排序的方式,其中 1 爲升序排列,而 -1 是用於降序排列。排序查找的基本語法爲db.collectionName.find().sort({key:1})
例如上面的goods集合,咱們想查詢結果按照sale升序排序,則命令爲db.goods.find().sort({'sale': 1})
> db.goods.find().sort({'sale': 1})
{ "_id" : ObjectId("5e953475aabbbfa8f930a968"), "name" : "商品名稱相同", "price" : 18, "sale" : 1 }
{ "_id" : ObjectId("5e95340faabbbfa8f930a966"), "name" : "商品名稱1", "price" : 19.99, "sale" : 8 }
{ "_id" : ObjectId("5e953450aabbbfa8f930a967"), "name" : "商品名稱相同", "price" : 18, "sale" : 9 }
{ "_id" : ObjectId("5e953475aabbbfa8f930a969"), "name" : "商品名稱99", "price" : 99, "sale" : 99 }
複製代碼
舒適提示:這裏須要說明一下,當skip()、limilt()和sort()三個放在一塊兒執行的時候,執行的順序是先 sort(), 而後是 skip(),最後是顯示的 limit()
到了這裏,相信你們對於MongoDB的基礎用法都會了,若是須要了解更多,能夠查找相關的教程和官方說明,若有說的不對或者不全的,請你們指出,我會及時改正,謝謝。