Windows系統初探MongoDB的基礎使用

MongoDB是什麼?

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

mongodb服務端啓動

絕對路勁的方式啓動

打開命令行工具,這裏我推薦一下Cmder命令行工具,我一直在用,打開後,輸入D:\mongodb\bin\mongod --dbpath D:\mongodb\data\db回車執行數組

mongod命令的方式啓動

配置了bin目錄的Path路徑,能夠直接用mongod命令啓動服務器,執行mongod --dbpath D:\mongodb\data\db或者在data目錄下執行mongod --dbpath .\dbbash

配置bin的Path路徑

爲了啓動mongodb方便,將mongod.exe路徑加入環境變量,位置:計算機->屬性->高級系統設置->環境變量,在系統變量的Path裏,在末尾加上安裝MongoDB的bin目錄,記得加英文分號‘;’。所有肯定保存後,從新打開命令行窗口,就能夠在任何地方都能用到mongod命令以及bin目錄下的其餘命令了服務器

客戶端鏈接

在以前啓動了服務器後,千萬不要關閉服務端的命令行窗口,須要再從新打開一個命令行窗口,在任意目錄下輸入mongo便可啓動客戶端(若是遇到「'mongo'不是內部或外部命令,也不是可運行的程序或批處理文件。」,請配置上面的Path路徑);若是你就是不想配置Path路徑,那你直接到你安裝目錄的bin目錄下,雙擊mongo.exe打開也能直接鏈接客戶端數據結構

MongoDB 概念解析

在mongodb中基本的概念是文檔、集合、數據庫分佈式

  • 數據庫:一個mongodb中能夠創建多個數據庫;MongoDB的默認數據庫爲"db",該數據庫存儲在data目錄中。使用show dbs,能夠查看所有數據庫
  • 集合:集合就是 MongoDB 文檔組,相似於RDBMS中的表格。集合存在於數據庫中,集合沒有固定的結構,這意味着你在對集合能夠插入不一樣格式和類型的數據。使用show collections,能夠查看當前數據庫實例下的所有集合
  • 文檔:文檔是一組鍵值(key-value)對(即 BSON)。MongoDB 的文檔不須要設置相同的字段,而且相同的字段不須要相同的數據類型。使用db.collection.find()命令,能夠查看collection集合下的所有文檔

數據庫(db)

初次鏈接客戶端,使用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
複製代碼

集合(collection)

建立集合

建立集合的語法爲db.createCollection(name, options),第一個參數name是必傳的集合名,第二個options是指定有關內存大小及索引的選項的可選參數,例如,咱們使用命令db.createCollection('goods')在order數據庫下新建一個goods集合,而後使用show collectionsshow 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()

文檔(document)

插入文檔

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那個是什麼意思呢?這是操做符,用來指定設置文檔某字段的值,還有其餘不少更新操做符,下面大概列一下:

  • $unset:刪除指定字段
  • $inc:給一個字段增長指定數值
  • $pop:刪除數組字段中的第一個或最後一個元素
  • $push:向數組中追加一個值
  • $pushAll:向數組中追加多個指定值
  • $pull:符合條件的值將被刪除
  • 其餘……

其餘更新文檔說明

另外,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 }
複製代碼

其餘刪除文檔說明

  1. 執行刪除操做的時候,默認是刪除全部符合條件的數據,若是你想刪除指定的最多條數,則在第二個參數傳入該限制數字:db.goods.remove({'goods': '商品名稱'}, 2),若是你想刪除集合的所有文檔傳入空對象便可,也就是db.goods.remove({})

  2. 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這是什麼意思呢,這是條件操做符,具體部分操做符以下:

  • $gt:查找字段值大於指定值的文檔
  • $lt:查找字段值小於指定值的文檔
  • $gte:查找字段值大於等於指定值的文檔
  • $lte:查找字段值小於等於指定值的文檔
  • $in:查找字段值等於指定數組中的任何值
  • $nin:字段值不在指定數組或者不存在
  • $or:文檔至少知足其中的一個表達式
  • $eq:查找字段值等於指定值的文檔
  • $ne:查找字段值不等於指定值的文檔,包括沒有這個字段的文檔
  • 其餘……

正則匹配的模糊查詢

另外,關於一些模糊查詢,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的基礎用法都會了,若是須要了解更多,能夠查找相關的教程和官方說明,若有說的不對或者不全的,請你們指出,我會及時改正,謝謝。

相關文章
相關標籤/搜索