MongoDB 基礎命令 (MongoDB Shell)


1、我們 mongodb 安裝成功后,用上一篇的方法啟動 mongodb服務 然后使用 mongodb shell 來做數據庫的增刪改查

2、創建數據庫

  • 語法:

use 數據庫名稱
  • 案例:

> use juyou
switched to db juyou
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB

這時創建完成過,使用命令查詢數據庫卻沒有我們剛創建的數據庫,這時因為剛創建的數據庫沒有數據,下面我們在數據庫中插入一條數據

> db.juyou.insert({"name":"聚優福利"})
WriteResult({ "nInserted" : 1 })
> show dbs
admin   0.000GB
config  0.000GB
juyou   0.000GB
local   0.000GB

這時就能看到剛剛創建的數據庫了

3、刪除數據庫

  • 語法:

db.dropDatabase()
  • 案例:

首先我們先查詢一下所有的數據庫

> show dbs
admin   0.000GB
config  0.000GB
juyou   0.000GB
local   0.000GB

然后我們可以使用 db 來查看當前的數據庫

> db
juyou

當前鏈接的數據庫就是 juyou,如果不是可以使用 use juyou 命令切換到 juyou 數據庫

> use juyou
switched to db juyou

執行刪除命令

> db.dropDatabase()
{ "dropped" : "juyou", "ok" : 1 }

然后再我們再查詢一下所有數據庫

> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB

已經成功刪除了

4、創建集合

語法:

db.createCollection(name, options)
  • name:集合名稱
  • options: 可選參數 
  • 案例:

創建一個名為 userinfo 的集合

> db.createCollection("userinfo")
{ "ok" : 1 }
> show collections
userinfo

創建成功后可以使用  show collections  命令查詢已有集合

 5、插入文檔

  • 語法:

db.集合名稱.insert(document)
  • 案例:

在 juyou 集合下的 userinfo 文檔中插入一條數據

> db.userinfo.insert({name:"郭大爺","sex":"","age":"不詳"})
WriteResult({ "nInserted" : 1 })
> db.userinfo.find()
{ "_id" : ObjectId("5abaf679a3aadbe625070c4f"), "name" : "郭大爺", "sex" : "", "age" : "不詳" }

插入成功后,可以使用  find()  來查詢剛剛插入的數據,下面會對查詢做詳細的講解,這里不多做解釋

可以看到插入數據后,多了一列 _id 的數據,在文檔中 mongodb 會將 _id 字段自動設置為主鍵,如果不指定mongodb會自動生成

自動生成的 ObjectId 是由時間戳、MachineID(電腦的 mac 地址)、進程ID以及自增計數器組成的,基本上不會重復

> db.userinfo.insert({"_id":1,name:"郭少爺","sex":"","age":"不詳"})
WriteResult({ "nInserted" : 1 })
> db.userinfo.find()
{ "_id" : ObjectId("5abaf679a3aadbe625070c4f"), "name" : "郭大爺", "sex" : "", "age" : "不詳" }
{ "_id" : 1, "name" : "郭少爺", "sex" : "", "age" : "不詳" }

也可以在插入數據時指定 _id 值,在之前使用mongodb開發中會指定給 _id 值,使用GUID(全球唯一標識)代替

我們也可以先將要插入的數據定義成變量

> var user = {name:"郭老師",sex:"",age:"18"}
> db.userinfo.insert(user)
WriteResult({ "nInserted" : 1 })
> db.userinfo.find()
{ "_id" : ObjectId("5abaf679a3aadbe625070c4f"), "name" : "郭大爺", "sex" : "", "age" : "不詳" }
{ "_id" : 1, "name" : "郭少爺", "sex" : "", "age" : "不詳" }
{ "_id" : ObjectId("5abb05afa3aadbe625070c50"), "name" : "郭老師", "sex" : "", "age" : "18" }

mongodb 在3.2版本后 提供了一次插入多條數據的方法 insertMany() ,我們下面把上面的三條數據刪除,然后試一下一次插入多條數據

> db.userinfo.remove({})
WriteResult({ "nRemoved" : 3 })
> db.userinfo.find()
> var users = [
   {
     _id:1,
     name:"郭大爺",
     sex:"",
     age:"80"
   },
   {
     _id:2,
     name:"郭老師",
     sex:"",
     age:"不詳"
   },
   {
     _id:3,
     name:"郭少爺",
     sex:"",
     age:"18"
   }
 ]
> db.userinfo.insertMany(users)
{ "acknowledged" : true, "insertedIds" : [ 1, 2, 3 ] }
> db.userinfo.find()
{ "_id" : 1, "name" : "郭大爺", "sex" : "", "age" : "80" }
{ "_id" : 2, "name" : "郭老師", "sex" : "", "age" : "不詳" }
{ "_id" : 3, "name" : "郭少爺", "sex" : "", "age" : "18" }

這樣我們可以直接插入一個數組

6、更新文檔

更新文檔有 update()save() 兩個方法,接下來分別介紹

  • update() 語法:

db.collection.update(
   <query>,
   <update>,
   {
     upsert: <boolean>,
     multi: <boolean>,
     writeConcern: <document>
   }
)
  • query:條件,相當於sql update時where條件
  • update: 要更新的內容,類似 sql 的 set 后面的內容
  • 案例:

我們先查詢一下,郭老師的年齡是不詳,現在我們根據主鍵_id來把年齡更新成20歲

> db.userinfo.find()
{ "_id" : 1, "name" : "郭大爺", "sex" : "", "age" : "80" }
{ "_id" : 2, "name" : "郭老師", "sex" : "", "age" : "不詳" }
{ "_id" : 3, "name" : "郭少爺", "sex" : "", "age" : "18" }
> db.userinfo.update({"_id":2},{$set:{"age":"20"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.userinfo.find()
{ "_id" : 1, "name" : "郭大爺", "sex" : "", "age" : "80" }
{ "_id" : 2, "name" : "郭老師", "sex" : "", "age" : "20" }
{ "_id" : 3, "name" : "郭少爺", "sex" : "", "age" : "18" }

已經成功將郭老師的年齡改成20,然后我們看到在更新命令中又一個 $set 的關鍵詞,這個是更新操作符,接下來我們介紹一下操作符

  • $inc:將文檔中的數字字段,增加值。比如個郭老師的年齡增加5歲就可以用這個操作符
  • $set:將文檔中的字段,更新為傳入的字段。上面已經演示過了
  • $unset:將文檔中的某個字段刪除
  • $rename:給字段重命名
  • (下面的操作符都是用來操作文檔中類型是數組的字段)
  • $push:將傳入的參數追加到,文檔中某個字段中,要追加的字段必須是數組類型
  • $addToSet:在文檔某個數組類型的字段中增加值,和上面兩個操作符類似,不過這個操作符在增加值時,數組中不能存在要增加的值
  • $pop:刪除文檔數組類型字段中第一個 {$pop:{name:1}} 或者最后一個值 {$pop:{name:-1}}
  • $pull:刪除和傳入參數相等的第一個值
  • $pullAll:和 $pull 一樣刪除值,$pullAll 可以傳入數組,一次刪除多個值
  • 參考文檔:https://blog.csdn.net/u014344668/article/details/52460682
  • save() 語法:

db.collection.save(
   <document>,
   {
     writeConcern: <document>
   }
)
  • docment:文檔
  • 案例:

先查詢一下所有的用戶,然后把_id為2的用戶年齡改為不詳。save() 方法會根據主鍵_id為條件替換文檔

> db.userinfo.find()
{ "_id" : 1, "name" : "郭大爺", "sex" : "", "age" : "80" }
{ "_id" : 2, "name" : "郭老師", "sex" : "", "age" : "20" }
{ "_id" : 3, "name" : "郭少爺", "sex" : "", "age" : "18" }
> var user = { "_id" : 2, "name" : "郭老師", "sex" : "", "age" : "不詳" }
> db.userinfo.save(user)
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.userinfo.find()
{ "_id" : 1, "name" : "郭大爺", "sex" : "", "age" : "80" }
{ "_id" : 2, "name" : "郭老師", "sex" : "", "age" : "不詳" }
{ "_id" : 3, "name" : "郭少爺", "sex" : "", "age" : "18" }
  • 問題:

save() 方法是以主鍵_id作條件,來替換文檔,如果在傳入的文檔中沒有主鍵_id,會怎么樣?下面我們試一下

> var user = { "name" : "郭老師", "sex" : "", "age" : "不詳" }
> db.userinfo.save(user)
WriteResult({ "nInserted" : 1 })
> db.userinfo.find()
{ "_id" : 1, "name" : "郭大爺", "sex" : "", "age" : "80" }
{ "_id" : 2, "name" : "郭老師", "sex" : "", "age" : "不詳" }
{ "_id" : 3, "name" : "郭少爺", "sex" : "", "age" : "18" }
{ "_id" : ObjectId("5abb2f42a3aadbe625070c51"), "name" : "郭老師", "sex" : "", "age" : "不詳" }

也可以執行成功,不過沒有更新其中的一個文檔,卻新插入了一條數據

7、查詢文檔

  • 語法:

db.collection.find(query, projection)
  • query:查詢條件
  • 案例:

可以在 find() 方法后面在 pertty() 方法以格式化的方式顯示文檔

> db.userinfo.find()
{ "_id" : 1, "name" : "郭大爺", "sex" : "", "age" : "80" }
{ "_id" : 2, "name" : "郭老師", "sex" : "", "age" : "不詳" }
{ "_id" : 3, "name" : "郭少爺", "sex" : "", "age" : "18" }
{ "_id" : ObjectId("5abb2f42a3aadbe625070c51"), "name" : "郭老師", "sex" : "", "age" : "不詳" }
> db.userinfo.find().pretty()
{ "_id" : 1, "name" : "郭大爺", "sex" : "", "age" : "80" }
{ "_id" : 2, "name" : "郭老師", "sex" : "", "age" : "不詳" }
{ "_id" : 3, "name" : "郭少爺", "sex" : "", "age" : "18" }
{
    "_id" : ObjectId("5abb2f42a3aadbe625070c51"),
    "name" : "郭老師",
    "sex" : "",
    "age" : "不詳"
}

mongodb query 條件與 sql where 條件 對比

8、$type 操作符

匹配字段類型

> db.userinfo.find()
{ "_id" : 1, "age" : 80 }
{ "_id" : 2, "name" : "郭老師", "sex" : "", "age" : "不詳" }
{ "_id" : 3, "age" : 18 }
{ "_id" : ObjectId("5abb2f42a3aadbe625070c51"), "name" : "郭老師", "sex" : "", "age" : "不詳" }
> db.userinfo.find({"age":{$type:2}})
{ "_id" : 2, "name" : "郭老師", "sex" : "", "age" : "不詳" }
{ "_id" : ObjectId("5abb2f42a3aadbe625070c51"), "name" : "郭老師", "sex" : "", "age" : "不詳" }

上面我們把字段 age 類型為 String 的文檔查詢出來,下面是 mongodb 中類型和數字的對照表

9、Limit() 方法與 Skip() 方法

  • Limit()

  • 語法

db.集合名稱.find().limit(數量)

取集合中指定數量的數據

  • 案例

 db.userinfo.find()
{ "_id" : 1, "name" : "郭大爺", "sex" : "", "age" : "80" }
{ "_id" : 2, "name" : "郭老師", "sex" : "", "age" : "不詳" }
{ "_id" : 3, "name" : "郭少爺", "sex" : "", "age" : "18" }
> db.userinfo.find().limit(2)
{ "_id" : 1, "name" : "郭大爺", "sex" : "", "age" : "80" }
{ "_id" : 2, "name" : "郭老師", "sex" : "", "age" : "不詳" }
  • Skip()

  • 語法

db.集合名稱.find().skip(數量)

在集合中取數據時跳過指定量數據

  • 案例

> db.userinfo.find()
{ "_id" : 1, "name" : "郭大爺", "sex" : "", "age" : "80" }
{ "_id" : 2, "name" : "郭老師", "sex" : "", "age" : "不詳" }
{ "_id" : 3, "name" : "郭少爺", "sex" : "", "age" : "18" }
> db.userinfo.find().skip(1)
{ "_id" : 2, "name" : "郭老師", "sex" : "", "age" : "不詳" }
{ "_id" : 3, "name" : "郭少爺", "sex" : "", "age" : "18" }

這兩個方法配合使用,就可以達到分頁的目的

10、排序

  • 語法

>db.collection.find().sort({key:1})
  • key:指定排序列,1代表正序、-1代表倒序

  • 案例

> db.userinfo.find()
{ "_id" : 1, "name" : "郭大爺", "sex" : "", "age" : "80" }
{ "_id" : 2, "name" : "郭老師", "sex" : "", "age" : "不詳" }
{ "_id" : 3, "name" : "郭少爺", "sex" : "", "age" : "18" }
> db.userinfo.find().sort({"age":1})
{ "_id" : 3, "name" : "郭少爺", "sex" : "", "age" : "18" }
{ "_id" : 1, "name" : "郭大爺", "sex" : "", "age" : "80" }
{ "_id" : 2, "name" : "郭老師", "sex" : "", "age" : "不詳" }
> db.userinfo.find().sort({"age":-1})
{ "_id" : 2, "name" : "郭老師", "sex" : "", "age" : "不詳" }
{ "_id" : 1, "name" : "郭大爺", "sex" : "", "age" : "80" }
{ "_id" : 3, "name" : "郭少爺", "sex" : "", "age" : "18" }
> 

上面分別是不排序、根據age正序、根據age倒序查詢

11、刪除文檔

  • 語法

db.collection.remove(
   <query>,
   <justOne>
)
  • query:刪除的條件
  • justOne:如果為 true 或者 1,只刪除滿足條件的第一個文檔
  • 案例

> db.userinfo.find()
{ "_id" : 1, "name" : "郭大爺", "sex" : "", "age" : "80" }
{ "_id" : 2, "name" : "郭老師", "sex" : "", "age" : "不詳" }
{ "_id" : 3, "name" : "郭少爺", "sex" : "", "age" : "18" }
> db.userinfo.remove({"sex":""},true)
WriteResult({ "nRemoved" : 1 })
> db.userinfo.find()
{ "_id" : 2, "name" : "郭老師", "sex" : "", "age" : "不詳" }
{ "_id" : 3, "name" : "郭少爺", "sex" : "", "age" : "18" }
> db.userinfo.remove({"sex":""})
WriteResult({ "nRemoved" : 2 })
> db.userinfo.find()
>

12、刪除集合

  • 語法

db.collection.drop()
  • 案例

> show collections
userinfo
> db.userinfo.drop()
true
> show collections
> 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM