============ 文檔 ============
文檔(document)的數(shù)據(jù)結(jié)構(gòu)和 JSON 基本一樣。 所有存儲在集合中的數(shù)據(jù)都是 BSON 格式
插入文檔
跟mysql一樣既可以單條插入,也可以多條執(zhí)行
單條插入
使用insert() 或 save() 方法向集合中插入文檔鹤啡,語法如下:
db.collection.insert(
<document or array of documents>,
{
writeConcern: <document>,
ordered: <boolean>
}
)
參數(shù):
【示例】
要向comment的集合(表)中插入一條測試數(shù)據(jù):
db.comment.insert({
"articleid": "100000",
"content": "今天天氣真好,陽光明 媚",
"userid": "1001",
"nickname": "Rose",
"createdatetime": new Date(),
"likenum": NumberInt(10),
"state": null
})
提示:
- comment集合如果不存在,則會隱式創(chuàng)建
- mongo中的數(shù)字讯屈,默認double類型,如要存整型营搅,必須使用函數(shù)NumberInt,否則取出來就有問題了拣展。
- 插入當(dāng)前日期使用 new Date()
- 插入的數(shù)據(jù)沒有指定 _id 敦冬,會自動生成主鍵值
- 如果某字段沒值币旧,可以賦值為null倾剿,或不寫該字段。
執(zhí)行后芝硬,如下,說明插入一個數(shù)據(jù)成功了
WriteResult({ "nInserted" : 1 })
注意:
- 文檔中的鍵/值對是有序的迄靠。
- 文檔中的值不僅可以是在雙引號里面的字符串,還可以是其他幾種數(shù)據(jù)類型(甚至可以是整個嵌入的文檔)罢低。
- MongoDB區(qū)分類型和大小寫辟汰。
- MongoDB的文檔不能有重復(fù)的鍵。
- 文檔的鍵是字符串命满。除了少數(shù)例外情況铸磅,鍵可以使用任意UTF-8字符羞迷。
文檔鍵命名規(guī)范:
- 鍵不能含有\(zhòng)0 (空字符)。這個字符用來表示鍵的結(jié)尾慢睡。
- .和$有特別的意義纬纪,只有在特定環(huán)境下才能使用。
- 以下劃線"_"開頭的鍵是保留的(不是嚴格要求的)
批量插入
語法:
db.collection.insertMany(
[ <document 1> , <document 2>, ... ],
{ writeConcern: <document>, ordered: <boolean> }
)
【示例】
批量插入多條文章評論:
db.comment.insertMany([{
"_id": "1",
"articleid": "100001",
"content": "我們不應(yīng)該把清晨浪費在手機上,健康很重要膝捞,一杯溫水幸福你我 他狐援。",
"userid": "1002",
"nickname": "相忘于江湖",
"createdatetime": new Date("2019-08- 05T22:08:15.522Z"),
"likenum": NumberInt(1000),
"state": "1"
},
{
"_id": "2",
"articleid": "100001",
"content": "我夏天空腹喝涼開水,冬天喝溫開水",
"userid": "1005",
"nickname": "伊人憔 悴",
"createdatetime": new Date("2019-08-05T23:58:51.485Z"),
"likenum": NumberInt(888),
"state": "1"
},
{
"_id": "3",
"articleid": "100001",
"content": "我一直喝涼開水指郁,冬天夏天都喝。",
"userid": "1004",
"nickname": "杰克船 長",
"createdatetime": new Date("2019-08-06T01:05:06.321Z"),
"likenum": NumberInt(666),
"state": "1"
},
{
"_id": "4",
"articleid": "100001",
"content": "專家說不能空腹吃飯项秉,影響健康。",
"userid": "1003",
"nickname": "凱 撒",
"createdatetime": new Date("2019-08-06T08:18:35.288Z"),
"likenum": NumberInt(2000),
"state": "1"
},
{
"_id": "5",
"articleid": "100001",
"content": "研究表明距潘,剛燒開的水千萬不能喝的妖,因為燙 嘴绣檬。",
"userid": "1003",
"nickname": "凱撒",
"createdatetime": new Date("2019-08- 06T11:01:02.521Z"),
"likenum": NumberInt(3000),
"state": "1"
}]);
提示:
插入時指定了 _id ,則主鍵就是該值嫂粟。
如果某條數(shù)據(jù)插入失敗娇未,將會終止插入,但已經(jīng)插入成功的數(shù)據(jù)不會回滾掉星虹。
因為批量插入由于數(shù)據(jù)較多容易出現(xiàn)失敗零抬,因此,可以使用try catch進行異常捕捉處理宽涌,測試的時候可以不處理平夜。
try {
db.comment.insertMany([{
"_id": "1",
"articleid": "100001",
"content": "我們不應(yīng)該把清晨浪費在手機上,健康很重要",
"userid": "1002",
"nickname": "相忘于江湖",
"createdatetime": new Date("2019-08- 05T22:08:15.522Z"),
"likenum": NumberInt(1000),
"state": "1"
},
{
"_id": "2",
"articleid": "100001",
"content": "我夏天空腹喝涼開水卸亮,冬天喝溫開水",
"userid": "1005",
"nickname": "伊人憔 悴",
"createdatetime": new Date("2019-08-05T23:58:51.485Z"),
"likenum": NumberInt(888),
"state": "1"
},
{
"_id": "3",
"articleid": "100001",
"content": "我一直喝涼開水忽妒,冬天夏天都喝。",
"userid": "1004",
"nickname": "杰克船 長",
"createdatetime": new Date("2019-08-06T01:05:06.321Z"),
"likenum": NumberInt(666),
"state": "1"
},
{
"_id": "4",
"articleid": "100001",
"content": "專家說不能空腹吃飯兼贸,影響健康段直。",
"userid": "1003",
"nickname": "凱 撒",
"createdatetime": new Date("2019-08-06T08:18:35.288Z"),
"likenum": NumberInt(2000),
"state": "1"
},
{
"_id": "5",
"articleid": "100001",
"content": "研究表明,剛燒開的水千萬不能喝寝受,因為燙 嘴。",
"userid": "1003",
"nickname": "凱撒",
"createdatetime": new Date("2019-08- 06T11:01:02.521Z"),
"likenum": NumberInt(3000),
"state": "1"
}]);
} catch (e) {
print (e);
}
查詢文檔
查詢數(shù)據(jù)的語法格式如下:
db.collection.find(<query>, [projection])
參數(shù):
Parameter | Type | Description |
---|---|---|
query | document | 可選罕偎。使用查詢運算符指定選擇篩選器很澄。若要返回集合中的所有文檔,請省略此參數(shù)或傳遞空文檔 ({}) |
projection | document | 可選颜及。指定要在與查詢篩選器匹配的文檔中返回的字段(投影)甩苛。若要返回匹配文檔中的所有字段, |
【示例】
查詢所有
如果我們要查詢集合的所有文檔俏站,我們輸入以下命令
db.comment.find()
或
db.comment.find({})
這里你會發(fā)現(xiàn)每條文檔會有一個叫_id的字段讯蒲,這個相當(dāng)于我們原來關(guān)系數(shù)據(jù)庫中表的主鍵,當(dāng)你在插入文檔記錄時沒有指定該字段肄扎, MongoDB會自動創(chuàng)建墨林,其類型是ObjectID類型赁酝。 如果我們在插入文檔記錄時指定該字段也可以,其類型可以是ObjectID類型旭等,也可以是MongoDB支持的任意類型.
如果我想按一定條件來查詢酌呆,比如我想查詢userid為1003的記錄,怎么辦搔耕?很簡單隙袁!只 要在fifind()中添加參數(shù)即可,參數(shù)也是json格式弃榨,如 下:
db.comment.find({userid:'1003'})
如果你只需要返回符合條件的第一條數(shù)據(jù)菩收,我們可以使用fifindOne命令來實現(xiàn),語法和fifind一樣鲸睛。
如:查詢用戶編號是1003的記錄娜饵,但只最多返回符合條件的第一條記錄:
db.comment.findOne({userid:'1003'})
投影查詢(Projection Query)
如果要查詢結(jié)果返回部分字段,則需要使用投影查詢(不顯示所有字段腊凶,只顯示指定的字段)划咐。
如:查詢結(jié)果只顯示 _id、userid钧萍、nickname :
db.comment.find({userid:"1003"},{userid:1,nickname:1})
如:查詢結(jié)果只顯示 褐缠、userid、nickname 风瘦,不顯示 _id :
db.comment.find({userid:"1003"},{userid:1,nickname:1,_id:0})
再例如:查詢所有數(shù)據(jù)队魏,但只顯示 _id、userid万搔、nickname :
db.comment.find({},{userid:1,nickname:1})
統(tǒng)計查詢
db.collection.count(query, options)
參數(shù):
Parameter | Type | Description |
---|---|---|
query | document | 查詢選擇條件胡桨。 |
options | document | 可選。用于修改計數(shù)的額外選項瞬雹。 |
【示例】
統(tǒng)計comment集合的所有的記錄數(shù):
db.comment.count()
統(tǒng)計userid為1003的記錄條數(shù)
db.comment.count({userid:"1003"})
分頁查詢
可以使用limit()方法來讀取指定數(shù)量的數(shù)據(jù)昧谊,使用skip()方法來跳過指定數(shù)量的數(shù)據(jù)
基本語法如下所示:
db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
如果你想返回指定條數(shù)的記錄,可以在fifind方法后調(diào)用limit來返回結(jié)果(TopN)酗捌,默認值20呢诬,例如
db.comment.find().limit(3)
skip方法同樣接受一個數(shù)字參數(shù)作為跳過的記錄條數(shù)。(前N個不要),默認值是0
db.comment.find().skip(3)
分頁查詢:需求:每頁2個胖缤,第二頁開始:跳過前兩條數(shù)據(jù)尚镰,接著值顯示3和4條數(shù)據(jù)
//第一頁
db.comment.find().skip(0).limit(2)
//第二頁
db.comment.find().skip(2).limit(2)
//第三頁
db.comment.find().skip(4).limit(2)
排序查詢
sort() 方法對數(shù)據(jù)進行排序,sort() 方法可以通過參數(shù)指定排序的字段哪廓,并使用 1 和 -1 來指定排序的方式狗唉,其中 1 為升序排列,而 -1 是用 于降序排列
db.COLLECTION_NAME.find().sort({KEY:1})
或
db.集合名稱.find().sort(排序方式)
例如:
對userid降序排列涡真,并對訪問量進行升序排列
db.comment.find().sort({userid:-1,likenum:1})
提示:
skip(), limilt(), sort()三個放在一起執(zhí)行的時候分俯,執(zhí)行的順序是先 sort(), 然后是 skip()肾筐,最后是顯示的 limit(),和命令編寫順序無關(guān)澳迫。
正則查詢
MongoDB的模糊查詢是通過正則表達式的方式實現(xiàn)的局齿。格式為:
db.collection.find({field:/正則表達式/})
或
db.集合.find({字段:/正則表達式/})
提示:正則表達式是js的語法,直接量的寫法橄登。
例如抓歼,我要查詢評論內(nèi)容包含“開水”的所有文檔,代碼如下:
db.comment.find({content:/開水/})
如果要查詢評論的內(nèi)容中以“專家”開頭的拢锹,代碼如下:
db.comment.find({content:/^專家/})
比較查詢
<, <=, >, >= 這個操作符也是很常用的谣妻,格式如下:
db.集合名稱.find({ "field" : { $gt: value }}) // 大于: field > value
db.集合名稱.find({ "field" : { $lt: value }}) // 小于: field < value
db.集合名稱.find({ "field" : { $gte: value }}) // 大于等于: field >= value
db.集合名稱.find({ "field" : { $lte: value }}) // 小于等于: field <= value
db.集合名稱.find({ "field" : { $ne: value }}) // 不等于: field != value
示例:查詢評論點贊數(shù)量大于700的記錄
db.comment.find({likenum:{$gt:NumberInt(700)}})
包含查詢
包含使用$in操作符。 示例:查詢評論的集合中userid字段包含1003或1004的文檔
db.comment.find({userid:{$in:["1003","1004"]}})
不包含使用$nin操作符卒稳。 示例:查詢評論集合中userid字段不包含1003和1004的文檔
db.comment.find({userid:{$nin:["1003","1004"]}})
條件連接查詢
我們?nèi)绻枰樵兺瑫r滿足兩個以上條件蹋半,需要使用$and操作符將條件進行關(guān)聯(lián)。 格式為:
$and:[ { },{ },{ } ]
示例:查詢評論集合中l(wèi)ikenum大于等于700 并且小于2000的文檔:
db.comment.find({$and:[{likenum:{$gte:NumberInt(700)}},{likenum:{$lt:NumberInt(2000)}}]})
如果兩個以上條件之間是或者的關(guān)系充坑,我們使用 操作符進行關(guān)聯(lián)减江,與前面 and的使用方式相同 格式為:
$or:[ { },{ },{ } ]
示例:查詢評論集合中userid為1003,或者點贊數(shù)小于1000的文檔記錄
db.comment.find({$or:[ {userid:"1003"} ,{likenum:{$lt:1000} }]})
修改文檔
更新文檔的語法:
db.collection.update(query, update, options)
或
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>,
collation: <document>,
arrayFilters: [ <filterdocument1>, ... ],
hint: <document|string> // Available starting in MongoDB 4.2
}
)
【示例】
覆蓋的修改
如果我們想修改_id為1的記錄捻爷,點贊量為1001辈灼,輸入以下語句:
db.comment.update({_id:"1"},{likenum:NumberInt(1001)})
執(zhí)行后,我們會發(fā)現(xiàn)也榄,這條文檔除了likenum字段其它字段都不見了
局部修改
為了解決這個問題巡莹,我們需要使用修改器$set來實現(xiàn),命令如下:
我們想修改_id為2的記錄甜紫,瀏覽量為889降宅,輸入以下語句:
db.comment.update({_id:"2"},{$set:{likenum:NumberInt(889)}})
這樣就OK啦。
批量修改
更新所有用戶為 1003 的用戶的昵稱為 凱撒大帝 囚霸。
db.comment.update({userid:"1003"},{$set:{nickname:"凱撒2"}})
//修改所有符合條件的數(shù)據(jù)
db.comment.update({userid:"1003"},{$set:{nickname:"凱撒大帝"}},{multi:true})
提示:如果不加后面的參數(shù)腰根,則只更新符合條件的第一條記錄
列值增長的修改
如果我們想實現(xiàn)對某列值在原有值的基礎(chǔ)上進行增加或減少,可以使用 $inc 運算符來實現(xiàn)拓型。
需求:對3號數(shù)據(jù)的點贊數(shù)额嘿,每次遞增1
db.comment.update({_id:"3"},{$inc:{likenum:NumberInt(1)}})
刪除文檔
刪除文檔的語法結(jié)構(gòu):
db.集合名稱.remove(條件)
以下語句可以將數(shù)據(jù)全部刪除,請慎用
db.comment.remove({})
如果刪除_id=1的記錄吨述,輸入以下語句
db.comment.remove({_id:"1"})