日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

首頁 > 數據庫 > MongoDB > 正文

深入了解mongodb shell指令實例

2024-09-07 00:22:30
字體:
來源:轉載
供稿:網友
       文本總結了一些MongoDB Shell 命令,小編認為是比較實用的,因此分享給大家作參考,包括數據庫、集合、文檔、條件操作符來篩選查詢結果等等內容,具有一定的參考價值,需要的朋友可以看看。
 
       mongodb數據庫結構與傳統關系型數據庫的比較,便于理解接下來的內容
 
數據庫->集合->文檔
數據庫->表  ->列
 
--------------------數據庫內容------------------
 
查看所有數據庫
 
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)
 
------------------插入數據 日韩三级免费观看| 国产三级视频网站| 国产一区激情在线| 在线中文字幕视频| 国产精品福利视频一区二区三区| 中文字幕在线观看精品| www日韩欧美| 欧美日韩午夜在线| 99热最新网址| 日韩欧美中文字幕视频| 欧美在线日韩在线| 国产www.大片在线| 精品日韩欧美在线| 欧美二区在线观看| 亚洲第一中文字幕| 久久福利视频一区二区| 欧美日韩高清在线播放| 国产一二三区精品视频| 日韩欧美一级二级三级久久久| 日韩在线一区二区| 欧美日韩中文在线| 欧美日韩国产页| 国产99在线 | 亚洲| 韩国一区二区av| 精品视频三区| 精品日韩在线| 久久久精品国产99久久精品芒果| 91精品久久久久久蜜臀| 在线欧美日韩精品| 日韩中文字幕在线视频播放| 在线三级av| 快she精品国产999| 91精品国产综合久久香蕉最新版| 欧美日韩高清在线播放| aaa欧美日韩| 亚洲大片精品永久免费| 国产欧美日产一区| 日韩欧美亚洲区| 日韩一级免费在线观看| 国产在线导航| 欧美日韩在线国产| 免费在线视频一区二区| 国产三级视频在线| 午夜亚洲福利| 亚洲欧美日本国产专区一区| 日本精品在线播放| 日韩在线视频网| 最新中文在线视频| 中文字幕五月天| 中文字幕久久av| 国产日韩在线视频| 欧美乱大交xxxxx免费| 一区二区三区精品在线| 欧美日韩亚洲国内综合网| 日韩欧美国产网站| 九九九精品视频| 中文精品在线| 久久久精品网| 国内国产区免费视频| 国产乱国产乱老熟300部视频| 欧美日韩激情一区二区三区| 欧美婷婷久久| 91精品高清| 日韩欧美字幕| 亚洲va久久久噜噜噜久久| 国产一级片网站| 亚洲国产午夜精品| 亚洲 欧美综合在线网络| 国产亚洲福利| 国产乱国产乱老熟300| 国产欧美日韩中文| 中文在线视频| 国产蜜臀在线| 国产亚洲人成a一在线v站| 在线日韩中文字幕| 色综合天天综合网天天狠天天 | 国产在线导航| 91一区二区| 69免费视频| 久久久99免费| 国产欧美日韩在线观看| 欧美日韩国产一区在线| 欧美日韩综合视频| 日韩欧美不卡视频| 日本啊v在线| 国产最新在线| 在线观看免费国产成人软件| 欧美日韩亚洲一区| 日韩在线视频精品| 欧美二三四区| 亚洲福利在线看| 日韩视频1区| 一区二区视频免费看| 精品在线一区二区| 欧美日韩国产三级| 欧美在线日韩在线| 亚洲三级网站| 国产欧美日韩在线看| av三级在线播放| 日韩在线播放一区二区| 日韩欧美在线中文字幕| 日韩专区中文字幕| 国产在线欧美| 国产在线第一页| 国产免费播放一区二区| 欧美日韩在线第一页| 一区二区三区在线|网站| 国产最顶级的黄色片在线免费观看| 国内激情久久| 中文字幕日韩精品在线| 欧美日韩亚洲一| 91精品国产综合久久久久久| 91精品国产经典在线观看| 日本不卡一区在线| 精品视频资源站| 精品久久人人做人人爽| 在线观看精品国产| 日本精品二区| 91精品国产入口| 国产亚洲一级| 高清中文字幕在线| 欧美日韩国产高清视频| 在线国产1区| 中文字幕高清在线播放| 精品国产31久久久久久| 日韩在线 中文字幕| 日韩一级在线视频| 色综合影院在线| 日韩精品一二三四区| 亚洲福利在线看| 国产v日产∨综合v精品视频| 亚洲第一网中文字幕| 国产午夜精品视频免费不卡69堂| 亚洲大胆人体av| 亚洲成在线观看| 日韩精品视频网| 亚洲免费精品视频| 日韩免费视频一区二区视频在线观看 | 精品视频久久| 欧美日韩国产区| 国产91久久久久蜜臀青青天草二| 亚洲精品中文字幕乱码三区| 亚洲电影中文字幕在线观看| www.中文字幕在线观看| 日韩久久精品网| 日韩欧美国产综合| 国产一级免费在线观看| 欧美日韩国产一二| 色综合影院在线| 亚洲午夜av| 欧美日韩国产免费| 在线观看区一区二| 日韩www在线| 国内不卡的二区三区中文字幕| 国产不卡一区| 欧美日韩国产综合视频在线观看| 亚洲视频资源在线| 日韩精品在线第一页| 欧美日韩亚洲综合| 国产亚洲一区字幕| 欧美日韩人人澡狠狠躁视频| 欧美日韩综合不卡| 在线观看国产福利视频| 国产成人精品999| 91精品国产91| 一区二区三区免费看视频| 国产h片在线观看| 在线亚洲人成| 亚洲免费播放| www.中文字幕在线| 亚洲二区自拍| 日韩欧美不卡在线| 日韩欧美999| 伊人伊成久久人综合网小说| 亚洲欧美中文在线视频| 在线视频不卡国产V| 日韩中文字幕国产| 婷婷中文字幕综合| 国产在线日韩精品| 人成在线免费视频| 91精品电影| 中文字幕亚洲二区| 日韩专区中文字幕| 99精品一级欧美片免费播放| 欧美一级手机免费观看片| 国产日韩精品电影| 欧美日韩成人一区| 刘玥91精选国产在线观看| 亚洲大胆人体av| 日韩国产亚洲欧美| 久久精品久久久久| 亚洲欧美日本国产专区一区| 国精品产品一区| 999精品网| 国产亚洲一级| 中文字幕精品一区二区三区在线| 中文字幕久久精品| 91国内精品在线视频| 日本xxxwww免费视频| 精品日韩在线观看| 日韩视频精品| 久久久久久久久99精品| 91精品国产自产观看在线| 久久精品国产91精品亚洲| 一区二区三区免费看视频| 国产精品一区二三区| 美女免费视频一区| 亚洲成年人影院在线| 一区二区三区免费看视频| 欧美婷婷久久| 日韩欧美在线第一页| 日韩av一区二| √新版天堂资源在线资源| 欧美日韩综合视频| 韩国av一区二区| 精品视频1区2区3区| 国产日韩中文在线| 一区在线视频观看| 亚洲乱码中文字幕综合| 国产成人精品网址| 精品在线一区二区| 久久精品免费在线观看| 国产999精品在线观看| 91久久精品午夜一区二区| 91色在线看| 日韩欧美国产黄色| 国产不卡的av| 欧美日韩国产在线| 欧美二区在线观看| 日韩a一区二区| 国产成人精品999| 欧美激情一区二区三区在线| 欧美日韩在线播放三区四区| 综合图区亚洲白拍在线| 国产日韩av高清| 亚洲国产综合久久| 国产一级片播放| 欧美 亚洲 精品 三区| 免费国产h视频在线观看86| 国产午夜精品视频| 精品国产欧美成人夜夜嗨| 91久久精品午夜一区二区| 日韩三级精品电影久久久| 欧美三级日韩三级| 欧美一卡2卡三卡4卡5免费| 日韩三级一区| 欧美日韩国产一区中文午夜| 日韩在线观看视频一区二区| 中文字幕亚洲乱码| 日韩欧美久久| 天天综合天天综合| 91精品国产入口| 欧美日韩色综合| 日韩欧美在线中字| 亚洲福利精品视频| 一区二区三区高清在线| 日韩在线一区二区视频| 亚洲欧洲日韩在线| 色综合天天综合网国产成人综合天| 久久夜色精品国产欧美乱极品| 精品精品久久| 成人精品视频一区| 日韩国产亚洲欧美| 91精品国产综合久久精品| 欧美日韩国产一中文字不卡| 日韩中文字幕在线视频播放| 国产在线导航| 日韩精品视频免费| 久久中文免费视频| 日韩三级视频在线看| 日韩在线高清视频| 久久精品99国产国产精| 日韩欧美不卡视频| 亚洲高清在线观看一区| a√免费观看在线网址www| 日本免费在线视频不卡一不卡二| 欧美日韩国产亚洲一区| 亚洲成av人片| 中文字幕欧美在线| 国产黄色一区| 日韩中文字幕视频在线| 欧美日韩在线综合| a天堂中文在线官网在线| 亚洲专区一二三| 欧美片网站免费| 999精品在线| 日韩在线中文| 先锋男人资源站| 国产区视频在线观看| 亚洲第一页中文字幕| 最新中文在线视频| 日本熟女一区二区| 亚洲欧美伊人| 亚洲高清在线免费| 中文国产字幕在线观看| 日韩午夜一区| 91精品蜜臀在线一区尤物| 国产日韩精品在线观看| 精品久久久91| 欧美不卡视频一区发布| 日韩高清不卡一区二区| 中文字幕在线导航| 日韩中文字幕| 日韩精品高清不卡| 亚洲欧洲日产国码av系列天堂 | 亚洲第一视频| 在线三级av| 国产在线www| 国产福利免费在线观看| 在线一区二区不卡| 内射国产内射夫妻免费频道| 91精品国产全国免费观看| 中文字幕国产欧美| 亚洲综合在线电影| 亚洲小说春色综合另类网蜜桃| 刘玥91精选国产在线观看| 国产最新在线| 日韩欧美国产三级| 欧洲一级精品| 日韩视频一区二区在线观看| 午夜伊人狠狠久久| 伊人网站在线| 91久久久久久久久| 蜜桃精品在线| 欧美日韩精品在线视频| 亚洲一卡二卡在线观看| 中文字幕日韩欧美| 亚洲日本精品视频| 一区二区三区精品99久久| 欧美在线视频一区二区| 综合图区亚洲白拍在线| 欧美日韩中文字幕在线| 国产男女av| 91精品国产综合久久香蕉的特点| 视频一区不卡| 日韩欧美一级二级三级久久久| 99亚洲视频| 搞黄在线观看| 一级一片免费视频| 视频一区不卡| 久久精品日韩无码| 91 中文字幕| 国产网站av| 精品全国在线一区二区| 日韩av一区二区在线| 欧美日韩午夜精品| 国产亚洲短视频| 中文字幕亚洲乱码| 欧美日韩国产一中文字不卡| 久久精品国产成人一区二区三区| 国产小视频免费在线网址| 国产在线观看精品| 亚洲成a人片在线www| 中文字幕亚洲区| 日韩欧美亚洲国产一区| 日韩精品三级| 亚洲九九精品| 日本va欧美va精品发布| 日本a级黄色| 亚洲а∨精品天堂在线| 国产中文伊人| 欧美三级网址| 九九在线精品| 日韩午夜中文字幕| 欧美日韩国产123区| 精品视频资源站| 国产不卡的av| 九九九精品视频| 日韩免费视频一区| 91精品在线观| a在线观看免费视频| 在线看av的网址| 亚洲一区在线观看免费| 国产在线拍偷自揄拍精品| 日韩国产成人| 精品在线网站观看| 久久riav| 日本精品在线播放| 欧美日韩精品国产| 一区二区精品区| av一区在线| 精品久久久三级| 日韩欧美中文第一页| 日本黄色一区二区三区| 日韩国产欧美| 亚洲高清不卡一区| 日韩视频国产视频| 婷婷中文字幕在线观看| 精品久久电影| 国产99对白在线播放| 久久香蕉精品| 欧美日韩一二三| 国产一二三四| 国产欧美日韩91| 中文字幕在线日韩| 日韩三级免费观看| 一区二区91| 日韩中文字幕| 中文字幕在线视频久| 精人妻一区二区三区|