共計 8593 個字符,預計需要花費 22 分鐘才能閱讀完成。
自動寫代碼機器人,免費開通
怎么在 MongoDB 中使用 Shell 命令?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
——————– 數據庫內容 ——————
查看所有數據庫
show dbs
刪除數據庫
db.dropDatebase()
——————– 集合內容 ——————–
創建集合
db.createCollection()
查看所有集合 \ 表
show collections
show tables
選定某一集合
use db_name
查看集合的信息
db.stats()
刪除一個集合,但是需要先指定一個數據庫,即先執行 use db_name
db.dropDatabase()
修改集合的名稱
db.collection_name.renameCollection(new_name)
———————- 文檔內容 ———————
插入數據
db.collection_name.insert(document)
db.collection_name.save(document)
查詢數據多條數據
db.collection_name.find()
1、可以指定返回的內容
參數解釋
db.collection_name.find({query_term:value},
return_key_name:1}
)
a find()函數的第一個參數是查詢條件,即匹配該內容的文檔都會被篩選出來,如果沒有查詢條件,則輸入 {},不可以為空
b find() 函數的第二個參數是指定返回的內容,例如一個 student 的集合中的一個 xiaoming 文檔中包含多條內容,姓名、學生號、家庭住址等,現在我只想看姓名,不想查詢的時候返回 xiaoming 文檔的全部內容,就可以使用這種 鍵名:1 的形式,后面的 1 表示篩選出該內容并正序輸出,0 表示篩選出除了該內容的其余部分,- 1 表示逆序跟 1 一樣的結果
c 可以返回多條記錄,這里只是舉個例子,還是拿 ixaoming 的例子
{
name :1,
student_id :1
}
這樣就返回了兩個信息,一個 name,一個 student_id
2、查詢嵌套信息
結合二維數組理解下面的這個信息
{
name : yang ,
sex : man ,
skill :[{ php :1},
{mongodb :4},
{redis :5}
favorite_food : meat
}
其中如果使用 skill 來作為 find()的查詢條件的話,千萬別寫成這樣
— 錯誤例子 —
db.self.find({skill :[{ php :1}]})
這樣是查不到的,因為這樣 mongodb 會將 {skill :[{ php :1}]} 解析成 skill 數組下只包含 php :1 這一條記錄的內容,上面的例子明顯不符合這一要求,所以查詢不到
— 正確的例子 —
db.self.find({skill.php :1})
這里使用了 . 告訴 mongodb 數據庫去匹配 skill 數組下 php 為 1 的內容,重點在于 skill 下是否有 php :1 這一條記錄
— 正確例子 2 —
如果一定要使用上面的錯誤例子的方式查詢數據,可以使用 $elemMatch 參數,注意該參數使用的位置
db.self.find({
skill :{$elemMatch:
{php :1}
})
這里的 $elemMatch 是作為條件操作符來使用的
查詢單條數據
db.collection_name.findOne()
skip 跳過查詢的最開始的數量,limit,限制返回數量,sort,當 x:1 表示正序,x:-1 表示逆序
db.collection_name.find()
.skip(Number).limit(Number).sort({x:1})
計算符合查詢條件的文檔的數量
db.collection_name.find()
.count()
count()函數默認情況下會忽略 skip()或 limit()函數,例如假設 student 集合中有 4 個文檔,下面的三條語句將顯示不同的結果
db.student.find().limit(1).count() 結果為 4,count 忽略了 limit(1)的條件
db.student.find().limit(1).count(true) 結果為 1,為 count()傳入參數 true
獲取結果的唯一值
db.collection_name.distinct(key_name)
也是查詢的函數,只不過他比起 find()會將查詢結果顯示唯一值,而不是根據原有集合中,文檔的數量來顯示結果,結合關系型數據庫中的 distinct 來理解,舉個例子,有一個圖書集合 –books,該集合下有書名,作者,出版日期等信息,注意,一個作者可能寫了很多本書,現在我想查看在該集合中有多少作者,如果我直接使用上面的 find()函數來搜索的話
db.books.find({ writer :1}
)
這樣會將全部的作者列出來,但是很多都是重復的,因為 find()是根據文檔數量來返回結果的,而 distinct()會將結果篩選,
其中重復的部分
db.books.distinct(writer)
將查詢結果分組
db.collection_name.group()
參數 1 key 按照此 key 進行分組
參數 2 initial 設置變量,該變量會在最終輸出,注意,這個變量是對每個分組都會定義一個的,一個新的分組開始就重新創建
參數 3 reduce 一個函數,在文檔分組期間執行,即對一個文檔進行一次分組就會執行一次,傳入兩個參數,一個是代表 initial 的參數,一個是目前進行分組的文檔,為了便于理解,分別取名叫 out 和 doc
參數 4 keyf,可選,作用跟 key 一樣,但是可以指定一個函數創建一個原本不存在于文檔中的字段作為分組的依據,需要傳入一個當前文檔的參數
參數 5 cond 過濾條件,只有滿足該條件的文檔才能參與分組
參數 6 finalize 在分組完成后執行的函數,傳入代表 initial 的參數
下面來看一個例子就能大致上了解了,先傳入幾個文檔到 orders 集合中
data1={
_id : ObjectId(552a330e05c27486b9b9b650),
_class : com.mongo.model.Orders ,
onumber : 002 ,
date : ISODate(2014-01-03T16:03:00Z),
cname : zcy ,
item : {
quantity : 1,
price : 4.0,
pnumber : p002
}
data2={
_id : ObjectId(552a331d05c275d8590a550d),
_class : com.mongo.model.Orders ,
onumber : 003 ,
date : ISODate(2014-01-04T16:03:00Z),
cname : zcy ,
item : {
quantity : 10,
price : 2.0,
pnumber : p001
}
}
data3={
_id : ObjectId(552a333105c2f28194045a72),
_class : com.mongo.model.Orders ,
onumber : 003 ,
date : ISODate(2014-01-04T16:03:00Z),
cname : zcy ,
item : {
quantity : 30,
price : 4.0,
pnumber : p002
}
}
data4={
_id : ObjectId(552a333f05c2b62c01cff50e),
_class : com.mongo.model.Orders ,
onumber : 004 ,
date : ISODate(2014-01-05T16:03:00Z),
cname : zcy ,
item : {
quantity : 5,
price : 4.0,
pnumber : p002
}
}
db.orders.insert(data1)
db.orders.insert(data2)
db.orders.insert(data3)
db.orders.insert(data4)
接下來展示 group()函數
例 1
db.orders.group({key:{data:1, item.pnumber :1},
initial:{total :0},
reduce:function (doc,out){out.total+=doc.item.quantity})
首先是按照 data 和 ietm 數組中的 pnumber 分組
接著定義了輸出變量 total,記錄每個產品的總數
接著是定義處理函數,也就是 reduce 中的函數,注意,傳入參數的先后順序,第一個參數表示當前進行分組的文檔,第二個參數表示 initial,所以 doc 能直接調用 doc.item.quantity,即文檔的內容,out 能調用 out.total,即 initial 的內容
例 2
db.orders.group({keyf:function(doc){return { month :doc.date.getMonth()+1};
initial:{total :0, money :0},
reduce:function (doc,out){
out.total+=doc.item.quantity*doc.item.price
finalize:function (out){
out.avg=out.money/out.total;
return out;
})
首先,這個例子展示了 keyf 的用法,他返回了一個新的字段 –month,接下來 mongodb 會按照 month 的計算結果分類
接著,就是在 keyf 以及 finalize 的函數中都有傳入參數,其實這個參數跟 reduce 中的參數名字沒有關系,這里寫在一起主要是為了便于理解其含義
最后就是在 finalize 中臨時創建了一個變量 avg,這個 avg 在最后也是會被輸出的
最后一點,在函數中處理結果都是會被 return 的
—————- 使用條件操作符來篩選查詢結果 ——————
一般情況下都使用在 find()的第一個參數內部,作為篩選條件使用
—$gt,$lt,$get,$lte,$ne—
db.collection_name.find(key_name:{$gt:value}
})
注意操作符的位置,看例子可以便于理解
db.student.find(height :{$gt:180}
})
表示篩選出學生集合中身高高于 180 的學生
可以同時使用兩個操作符來指定范圍
db.student.find({height :{$gt:180,$lt:220}
})
這兩個的使用方法跟上面是一樣的,但是需要單獨拎出來講,因為有點特殊
—$in,$nin—
db.student.find({height :{$in:[170,180,190,200]}
})
表示篩選出身高為 170,180,190,200 的學生,$nin 就是篩選除了 170,180,190,200 之外的學生
—$all—
上面的 $in 中的內容是‘或 的形式,只要你的身高是 170,或 180,或 190,或 200,那么你就符合篩選條件,而 $all 則是且的關系
db.student.find({height :{$all:[170,180,190,200]}
})
這句話的意思是你的身高既是 170,又是 180,又是 190,又是 200 才能滿足條件
—$or—
db.student.find({
$or:[{ score :100},
{sex :man}
})
上面的例子中,score:100 與 sex:man 是‘或 的關系,結合下面的例子就可以看出 $or 的作用了
db.student.find({ score :100, sex : man}
)
其中的 score:100 與 sex:man 是且的關系
limit(x)函數加 skip(y)函數 =$slice:[y,x]
具體使用方法可以看下面這個例子
db.student.find({ height :{$slice:[10,5]}}
)
還是那句老話,注意 $slice 的位置,這句話表示篩選身高第 11 到 15 的人,第一個參數是 skip()的參數,第二個是 limit()
limit()函數是限制返回文檔的數量的,$size 是篩選符合數量的數組的,看下面的例子就明白了
先在數據庫中添加以下信息
message={
cds :[{ first_song : hello},
{second_song : world},
{third_song : again}
db.songs.insert(message)
接著我們來查詢一下上述結果
db.songs.find({ cds :{$size:2}}
)
無返回結果,因為 cds 數組里有 3 組數據
db.songs.find({ cds :{$size:3}}
)
返回全部結果,注意一點,這里是作為 find()函數的第一個參數傳入的,所以是篩選條件
篩選含有特定字段的值
db.collection_name.find(key_name:{$exit:true}
})
返回存在該字段的文檔,注意,這里是存在該字段,而沒有指定該字段的具體內容
根據數據類型篩選返回結果
db.collection_name.find(key_name :{$type:x}
})
其中的 x 取值內容有很多,這里就不介紹了,因為太多了看一遍也沒用
在篩選中使用正則表達式
db.collection_name.find(key_name :/ /})
在 / / 中添加正則表達式的內容
更新數據
db.collection_name.update({original_key:original_value},{new_key:new_value})
1、只要原 collection 中包含 original_key:original_value 就會被選中成為操作對象
2、整個 collection 都會被更新成 new_key:new_value,而不單單就只是更新 original_key:original_value
相較于上面會更新整個集合,下面添加了 $set: 的形式來只進行部分字段的更新
db.collection_name.update({original_key:original_value},{$set:{new_key:new_value}})
上面使用 $set 更新了一條字段,可以使用 $unset 刪除一條字段
db.collection_name.update{{$unset:{key:value}}
}
如果此更新數據不存在就創建這一條數據,加第三個參數為 true 就可以實現了
db.collection_name.update({original_key:original_value},{new_key:new_value},true)
或者下面的形式也可以
db.collection_name.update({original_key:original_value},{new_key:new_value},{upsert:true})
update 只會更新第一條滿足條件的記錄,但是想更新多條記錄時,將第三個參數設置為 false,第四個參數設置為 true,而且還要設置 $set
db.collection_name.update({original_key:original_value},{$set{new_key:new_value}},false,true)
—————— 插入數據——數組部分 ——————–
插入數據
db.collection_name.update({original_key:value},
{$push:{new_key:new:value)
注意,如果 original_key 不存在,則會被創建,并且定義為數組的形式,new_key:value 則是第一個值
如果 original_key 存在,并且數數組,則插入 new_key:value,如果不是數組,則報錯
一次性插入多個值,前面是使用 $push 一次插入一個值,如果想插入多個值的話,需要使用下面的內容
db.collection_name.update({original_key:value},
{$push:{
new_key:{
$each:[
value1 ,
value2 ,
value3
})
注意這里的 $push 是針對數組操作的,也就是 $each 后面的內容都將添加到 new_key 的數組中
與 $push 對應,$pop 刪除數組中的數據
db.collection_name.update({original_key:value},
{$pop:{{original_key:1}
})
注意,這里的 1 表示刪除的數量,可以是 2,3 等整數,表示從數組的后端開始刪除,也可以是 - 1 等負數,表示從數組的前端開始刪除
前面的 $pop 可以指定刪除的數量,但是不能指定刪除的條件,$pull 則可以
db.collection_name.update({original_key:value},
{$pull:
{key1:value1}
)
$pull 會刪除掉 key1 中所有 value1 的數據,注意,是刪除 key1 中的 value1 數據,不是刪除 key1,所以只要 key1 數組中包含了 value1 就會被刪除掉 value1
與 $pull 類似,$pullAll 可以刪除掉多個數據
db.collection_name.update({original_key:value},
{$pullAll:{
key1:
value1 ,
value2 ,
value3
})
$addToSet 是一個非常實用的向數組添加數據的命令,如果該數據不存在則添加,存在就不會重復添加了
db.collection_name.update({original_key:value},
{$addToSet:{
new_key:{
$each:[
value1 ,
value2 ,
value3
})
設想一下,如果這里不添加 $each 的情況,如果不添加 $each, 則會變成往數組 new_key 中直接添加新的數組
[value1 , value2 , value3]
可以嘗試一下,理解 $each 的功能,回到 $addToSet 上來,如果原數組中就存在 value1,value2,value3 則不會添加,如果不存在,則將沒有的添加進去,有的也不會重復添加,彼此之間不是互相影響的。
原子操作
這里就不解釋什么叫原子操作了,對于我們使用者來說只要知道怎么采用原子操作就可以了
db.collection_name.findAndModify(query:{key:value},
sort:{key2:1/-1},
update/remove:true,
new:true
)
query 指定查詢的文檔
sort 排序,1,- 1 的含義這里就不解釋了,跟上面一樣
update/remove 表示操作
new 表示返回最終的修改結果,可以不填
刪除所有查找到的數據
db.coolection_name.remove({key:value})
刪除一張表
db.collection_name.drop()
查看集合的索引
db.collection_name.getIndexes()
創建索引
db.collection_name.ensureIndex({key:value})
前面是根據 key:value 的形式創建索引的,接下來就為一集合的某一字段全部創建索引
db.collection_name.ensureIndex({key:1})
復合索引的創建就是在其中多添加幾個內容
刪除索引
db.collection_name.dropIndex({key:value})
刪除所有索引
db.collection_name.dropIndexes()
前面我們操作的都是一個集合,接下來我們要學習簡單的操作多個集合了,有兩種方式,手動或者使用 DBRef
先創建兩個集合
collection1={
name : yang ,
sex : man
collection2={
id :1,
name : yang ,
math :60,
pe :30,
chinese :60
db.student.save(collection2)
db.yang.save(collection)
接下來就是大致思路了
yang=db.yang.findOne()
db.student.find({ name :yang.name}
)
關于怎么在 MongoDB 中使用 Shell 命令問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注丸趣 TV 行業資訊頻道了解更多相關知識。
向 AI 問一下細節