MongoDB :第五章:MongoDB 插入更新刪除查詢文檔
MongoDB 插入文檔
本章節(jié)中我們將向大家介紹如何將數(shù)據(jù)插入到MongoDB的集合中。
文檔的數(shù)據(jù)結(jié)構(gòu)和JSON基本一樣。
所有存儲(chǔ)在集合中的數(shù)據(jù)都是BSON格式。
BSON 是一種類似 JSON 的二進(jìn)制形式的存儲(chǔ)格式,是 Binary JSON 的簡(jiǎn)稱。
插入文檔
MongoDB 使用 insert() 或 save() 方法向集合中插入文檔,語(yǔ)法如下:
db.COLLECTION_NAME.insert(document)
實(shí)例
以下文檔可以存儲(chǔ)在 MongoDB 的 runoob 數(shù)據(jù)庫(kù) 的 col 集合中:
>db.col.insert({title: 'MongoDB 教程',
description: 'MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)',
by: '菜鳥(niǎo)教程',
url: 'http://www.runoob.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})
以上實(shí)例中 col 是我們的集合名,如果該集合不在該數(shù)據(jù)庫(kù)中, MongoDB 會(huì)自動(dòng)創(chuàng)建該集合并插入文檔。
查看已插入文檔:
> db.col.find()
{ "_id" :
ObjectId("56064886ade2f21f36b03134"), "title" : "MongoDB 教程",
"description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)", "by" : "菜鳥(niǎo)教程", "url" :
"http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ],
"likes" : 100 }
>
我們也可以將數(shù)據(jù)定義為一個(gè)變量,如下所示:
> document=({title: 'MongoDB 教程',
description: 'MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)',
by: '菜鳥(niǎo)教程',
url: 'http://www.runoob.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
});
執(zhí)行后顯示結(jié)果如下:
{
"title" : "MongoDB 教程",
"description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)",
"by" : "菜鳥(niǎo)教程",
"url" : "http://www.runoob.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
執(zhí)行插入操作:
> db.col.insert(document)
WriteResult({ "nInserted" : 1 })
>
插入文檔你也可以使用 db.col.save(document) 命令。如果不指定 _id 字段 save() 方法類似于 insert() 方法。如果指定 _id 字段,則會(huì)更新該 _id 的數(shù)據(jù)。
MongoDB 刪除集合
MongoDB 更新文檔
2 篇筆記 寫(xiě)筆記
二少
272***623@qq.com
參考地址
3.2 版本后還有以下幾種語(yǔ)法可用于插入文檔:
db.collection.insertOne():向指定集合中插入一條文檔數(shù)據(jù)
db.collection.insertMany():向指定集合中插入多條文檔數(shù)據(jù)
# 插入單條數(shù)據(jù)
> var document = db.collection.insertOne({"a": 3})
> document
{
"acknowledged" : true,
"insertedId" : ObjectId("571a218011a82a1d94c02333")
}
# 插入多條數(shù)據(jù)
> var res = db.collection.insertMany([{"b": 3}, {'c': 4}])
> res
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("571a22a911a82a1d94c02337"),
ObjectId("571a22a911a82a1d94c02338")
]
}
二少
二少
272***623@qq.com
參考地址
2年前 (2017-07-12)
Tffans
897***246@qq.com
一次插入多條數(shù)據(jù)
1、先創(chuàng)建數(shù)組
2、將數(shù)據(jù)放在數(shù)組中
3、一次 insert 到集合中
var arr = [];
for(var i=1 ; i<=20000 ; i++){
arr.push({num:i});
}
db.numbers.insert(arr);
MongoDB 更新文檔
MongoDB 使用 update() 和 save() 方法來(lái)更新集合中的文檔。接下來(lái)讓我們?cè)敿?xì)來(lái)看下兩個(gè)函數(shù)的應(yīng)用及其區(qū)別。
update() 方法
update() 方法用于更新已存在的文檔。語(yǔ)法格式如下:
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
參數(shù)說(shuō)明:
query : update的查詢條件,類似sql update查詢內(nèi)where后面的。
update : update的對(duì)象和一些更新的操作符(如$,$inc...)等,也可以理解為sql update查詢內(nèi)set后面的
upsert : 可選,這個(gè)參數(shù)的意思是,如果不存在update的記錄,是否插入objNew,true為插入,默認(rèn)是false,不插入。
multi : 可選,mongodb 默認(rèn)是false,只更新找到的第一條記錄,如果這個(gè)參數(shù)為true,就把按條件查出來(lái)多條記錄全部更新。
writeConcern :可選,拋出異常的級(jí)別。
實(shí)例
我們?cè)诩?col 中插入如下數(shù)據(jù):
>db.col.insert({
title: 'MongoDB 教程',
description: 'MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)',
by: '菜鳥(niǎo)教程',
url: 'http://www.runoob.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})
接著我們通過(guò) update() 方法來(lái)更新標(biāo)題(title):
>db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) # 輸出信息
> db.col.find().pretty()
{
"_id" : ObjectId("56064f89ade2f21f36b03136"),
"title" : "MongoDB",
"description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)",
"by" : "菜鳥(niǎo)教程",
"url" : "http://www.runoob.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
>
可以看到標(biāo)題(title)由原來(lái)的 "MongoDB 教程" 更新為了 "MongoDB"。
以上語(yǔ)句只會(huì)修改第一條發(fā)現(xiàn)的文檔,如果你要修改多條相同的文檔,則需要設(shè)置 multi 參數(shù)為 true。
>db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}},{multi:true})
save() 方法
save() 方法通過(guò)傳入的文檔來(lái)替換已有文檔。語(yǔ)法格式如下:
db.collection.save(
<document>,
{
writeConcern: <document>
}
)
參數(shù)說(shuō)明:
document : 文檔數(shù)據(jù)。
writeConcern :可選,拋出異常的級(jí)別。
實(shí)例
以下實(shí)例中我們替換了 _id 為 56064f89ade2f21f36b03136 的文檔數(shù)據(jù):
>db.col.save({
"_id" : ObjectId("56064f89ade2f21f36b03136"),
"title" : "MongoDB",
"description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)",
"by" : "Runoob",
"url" : "http://www.runoob.com",
"tags" : [
"mongodb",
"NoSQL"
],
"likes" : 110
})
替換成功后,我們可以通過(guò) find() 命令來(lái)查看替換后的數(shù)據(jù)
>db.col.find().pretty()
{
"_id" : ObjectId("56064f89ade2f21f36b03136"),
"title" : "MongoDB",
"description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)",
"by" : "Runoob",
"url" : "http://www.runoob.com",
"tags" : [
"mongodb",
"NoSQL"
],
"likes" : 110
}
>
更多實(shí)例
只更新第一條記錄:
db.col.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } );
全部更新:
db.col.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true );
只添加第一條:
db.col.update( { "count" : { $gt : 4 } } , { $set : { "test5" : "OK"} },true,false );
全部添加進(jìn)去:
db.col.update( { "count" : { $gt : 5 } } , { $set : { "test5" : "OK"} },true,true );
全部更新:
db.col.update( { "count" : { $gt : 15 } } , { $inc : { "count" : 1} },false,true );
只更新第一條記錄:
db.col.update( { "count" : { $gt : 10 } } , { $inc : { "count" : 1} },false,false );
MongoDB 刪除文檔
在前面的幾個(gè)章節(jié)中我們已經(jīng)學(xué)習(xí)了MongoDB中如何為集合添加數(shù)據(jù)和更新數(shù)據(jù)。在本章節(jié)中我們將繼續(xù)學(xué)習(xí)MongoDB集合的刪除。
MongoDB remove()函數(shù)是用來(lái)移除集合中的數(shù)據(jù)。
MongoDB數(shù)據(jù)更新可以使用update()函數(shù)。在執(zhí)行remove()函數(shù)前先執(zhí)行find()命令來(lái)判斷執(zhí)行的條件是否正確,這是一個(gè)比較好的習(xí)慣。
語(yǔ)法
remove() 方法的基本語(yǔ)法格式如下所示:
db.collection.remove(
<query>,
<justOne>
)
如果你的 MongoDB 是 2.6 版本以后的,語(yǔ)法格式如下:
db.collection.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)
參數(shù)說(shuō)明:
query :(可選)刪除的文檔的條件。
justOne : (可選)如果設(shè)為 true 或 1,則只刪除一個(gè)文檔,如果不設(shè)置該參數(shù),或使用默認(rèn)值 false,則刪除所有匹配條件的文檔。
writeConcern :(可選)拋出異常的級(jí)別。
實(shí)例
以下文檔我們執(zhí)行兩次插入操作:
>db.col.insert({title: 'MongoDB 教程',
description: 'MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)',
by: '菜鳥(niǎo)教程',
url: 'http://www.runoob.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})
使用 find() 函數(shù)查詢數(shù)據(jù):
> db.col.find()
{ "_id" :
ObjectId("56066169ade2f21f36b03137"), "title" : "MongoDB 教程",
"description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)", "by" : "菜鳥(niǎo)教程", "url" :
"http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ],
"likes" : 100 }
{ "_id" : ObjectId("5606616dade2f21f36b03138"),
"title" : "MongoDB 教程", "description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)", "by" :
"菜鳥(niǎo)教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb",
"database", "NoSQL" ], "likes" : 100 }
接下來(lái)我們移除 title 為 'MongoDB 教程' 的文檔:
>db.col.remove({'title':'MongoDB 教程'})
WriteResult({ "nRemoved" : 2 }) # 刪除了兩條數(shù)據(jù)
>db.col.find()
…… # 沒(méi)有數(shù)據(jù)
如果你只想刪除第一條找到的記錄可以設(shè)置 justOne 為 1,如下所示:
>db.COLLECTION_NAME.remove(DELETION_CRITERIA,1)
如果你想刪除所有數(shù)據(jù),可以使用以下方式(類似常規(guī) SQL 的 truncate 命令):
>db.col.remove({})
>db.col.find()
>
MongoDB 更新文檔
MongoDB 查詢文檔
2 篇筆記 寫(xiě)筆記
三國(guó)電視臺(tái)
tre***3@126.com
remove() 方法已經(jīng)過(guò)時(shí)了,現(xiàn)在官方推薦使用 deleteOne() 和 deleteMany() 方法。
如刪除集合下全部文檔:
db.inventory.deleteMany({})
刪除 status 等于 A 的全部文檔:
db.inventory.deleteMany({ status : "A" })
刪除 status 等于 D 的一個(gè)文檔:
db.inventory.deleteOne( { status: "D" } )
三國(guó)電視臺(tái)
三國(guó)電視臺(tái)
tre***3@126.com
2年前 (2017-09-22)
sairre
jsa***e@163.com
remove() 方法 并不會(huì)真正釋放空間。
需要繼續(xù)執(zhí)行 db.repairDatabase() 來(lái)回收磁盤空間。
> db.repairDatabase()
或者
> db.runCommand({ repairDatabase: 1 })
MongoDB 查詢文檔
MongoDB 查詢文檔使用 find() 方法。
find() 方法以非結(jié)構(gòu)化的方式來(lái)顯示所有文檔。
語(yǔ)法
MongoDB 查詢數(shù)據(jù)的語(yǔ)法格式如下:
db.collection.find(query, projection)
query :可選,使用查詢操作符指定查詢條件
projection :可選,使用投影操作符指定返回的鍵。查詢時(shí)返回文檔中所有鍵值, 只需省略該參數(shù)即可(默認(rèn)省略)。
如果你需要以易讀的方式來(lái)讀取數(shù)據(jù),可以使用 pretty() 方法,語(yǔ)法格式如下:
>db.col.find().pretty()
pretty() 方法以格式化的方式來(lái)顯示所有文檔。
實(shí)例
以下實(shí)例我們查詢了集合 col 中的數(shù)據(jù):
> db.col.find().pretty()
{
"_id" : ObjectId("56063f17ade2f21f36b03133"),
"title" : "MongoDB 教程",
"description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)",
"by" : "菜鳥(niǎo)教程",
"url" : "http://www.runoob.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
除了 find() 方法之外,還有一個(gè) findOne() 方法,它只返回一個(gè)文檔。
MongoDB 與 RDBMS Where 語(yǔ)句比較
如果你熟悉常規(guī)的 SQL 數(shù)據(jù),通過(guò)下表可以更好的理解 MongoDB 的條件語(yǔ)句查詢:
操作 格式 范例 RDBMS中的類似語(yǔ)句
等于 {<key>:<value>} db.col.find({"by":"菜鳥(niǎo)教程"}).pretty() where by = '菜鳥(niǎo)教程'
小于 {<key>:{$lt:<value>}} db.col.find({"likes":{$lt:50}}).pretty() where likes < 50
小于或等于 {<key>:{$lte:<value>}} db.col.find({"likes":{$lte:50}}).pretty() where likes <= 50
大于 {<key>:{$gt:<value>}} db.col.find({"likes":{$gt:50}}).pretty() where likes > 50
大于或等于 {<key>:{$gte:<value>}} db.col.find({"likes":{$gte:50}}).pretty() where likes >= 50
不等于 {<key>:{$ne:<value>}} db.col.find({"likes":{$ne:50}}).pretty() where likes != 50
MongoDB AND 條件
MongoDB 的 find() 方法可以傳入多個(gè)鍵(key),每個(gè)鍵(key)以逗號(hào)隔開(kāi),即常規(guī) SQL 的 AND 條件。
語(yǔ)法格式如下:
>db.col.find({key1:value1, key2:value2}).pretty()
實(shí)例
以下實(shí)例通過(guò) by 和 title 鍵來(lái)查詢 菜鳥(niǎo)教程 中 MongoDB 教程 的數(shù)據(jù)
> db.col.find({"by":"菜鳥(niǎo)教程", "title":"MongoDB 教程"}).pretty()
{
"_id" : ObjectId("56063f17ade2f21f36b03133"),
"title" : "MongoDB 教程",
"description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)",
"by" : "菜鳥(niǎo)教程",
"url" : "http://www.runoob.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
以上實(shí)例中類似于 WHERE 語(yǔ)句:WHERE by='菜鳥(niǎo)教程' AND title='MongoDB 教程'
MongoDB OR 條件
MongoDB OR 條件語(yǔ)句使用了關(guān)鍵字 $or,語(yǔ)法格式如下:
>db.col.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
).pretty()
實(shí)例
以下實(shí)例中,我們演示了查詢鍵 by 值為 菜鳥(niǎo)教程 或鍵 title 值為 MongoDB 教程 的文檔。
>db.col.find({$or:[{"by":"菜鳥(niǎo)教程"},{"title": "MongoDB 教程"}]}).pretty()
{
"_id" : ObjectId("56063f17ade2f21f36b03133"),
"title" : "MongoDB 教程",
"description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)",
"by" : "菜鳥(niǎo)教程",
"url" : "http://www.runoob.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
>
AND 和 OR 聯(lián)合使用
以下實(shí)例演示了 AND 和 OR 聯(lián)合使用,類似常規(guī) SQL 語(yǔ)句為: 'where likes>50 AND (by = '菜鳥(niǎo)教程' OR title = 'MongoDB 教程')'
>db.col.find({"likes": {$gt:50}, $or: [{"by": "菜鳥(niǎo)教程"},{"title": "MongoDB 教程"}]}).pretty()
{
"_id" : ObjectId("56063f17ade2f21f36b03133"),
"title" : "MongoDB 教程",
"description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)",
"by" : "菜鳥(niǎo)教程",
"url" : "http://www.runoob.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
MongoDB 刪除文檔
MongoDB 條件操作符
3 篇筆記 寫(xiě)筆記
DisLido
補(bǔ)充一下 projection 參數(shù)的使用方法
db.collection.find(query, projection)
若不指定 projection,則默認(rèn)返回所有鍵,指定 projection 格式如下,有兩種模式
db.collection.find(query, {title: 1, by: 1}) // inclusion模式 指定返回的鍵,不返回其他鍵
db.collection.find(query, {title: 0, by: 0}) // exclusion模式 指定不返回的鍵,返回其他鍵
_id 鍵默認(rèn)返回,需要主動(dòng)指定 _id:0 才會(huì)隱藏
兩種模式不可混用(因?yàn)檫@樣的話無(wú)法推斷其他鍵是否應(yīng)返回)
db.collection.find(query, {title: 1, by: 0}) // 錯(cuò)誤
只能全1或全0,除了在inclusion模式時(shí)可以指定_id為0
db.collection.find(query, {_id:0, title: 1, by: 1}) // 正確
pengll
若不想指定查詢條件參數(shù) query 可以 用 {} 代替,但是需要指定 projection 參數(shù):
querydb.collection.find({}, {title: 1})
離別鉤
如果是 qty 大于 50 小于 80 不能這樣寫(xiě):
db.posts.find( { qty: { $gt: 50 }, qty: { $lt: 80 } } )
應(yīng)該這樣:
db.posts.find( { qty: { $gt: 50 ,$lt: 80}} )
MongoDB 條件操作符
描述
條件操作符用于比較兩個(gè)表達(dá)式并從mongoDB集合中獲取數(shù)據(jù)。
在本章節(jié)中,我們將討論如何在MongoDB中使用條件操作符。
MongoDB中條件操作符有:
(>) 大于 - $gt
(<) 小于 - $lt
(>=) 大于等于 - $gte
(<= ) 小于等于 - $lte
我們使用的數(shù)據(jù)庫(kù)名稱為"runoob" 我們的集合名稱為"col",以下為我們插入的數(shù)據(jù)。
為了方便測(cè)試,我們可以先使用以下命令清空集合 "col" 的數(shù)據(jù):
db.col.remove({})
插入以下數(shù)據(jù)
>db.col.insert({
title: 'PHP 教程',
description: 'PHP 是一種創(chuàng)建動(dòng)態(tài)交互性站點(diǎn)的強(qiáng)有力的服務(wù)器端腳本語(yǔ)言。',
by: '菜鳥(niǎo)教程',
url: 'http://www.runoob.com',
tags: ['php'],
likes: 200
})
>db.col.insert({title: 'Java 教程',
description: 'Java 是由Sun Microsystems公司于1995年5月推出的高級(jí)程序設(shè)計(jì)語(yǔ)言。',
by: '菜鳥(niǎo)教程',
url: 'http://www.runoob.com',
tags: ['java'],
likes: 150
})
>db.col.insert({title: 'MongoDB 教程',
description: 'MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)',
by: '菜鳥(niǎo)教程',
url: 'http://www.runoob.com',
tags: ['mongodb'],
likes: 100
})
使用find()命令查看數(shù)據(jù):
> db.col.find()
{ "_id" :
ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" :
"PHP 是一種創(chuàng)建動(dòng)態(tài)交互性站點(diǎn)的強(qiáng)有力的服務(wù)器端腳本語(yǔ)言。", "by" : "菜鳥(niǎo)教程", "url" :
"http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 }
{
"_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程",
"description" : "Java 是由Sun Microsystems公司于1995年5月推出的高級(jí)程序設(shè)計(jì)語(yǔ)言。", "by" :
"菜鳥(niǎo)教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" :
150 }
{ "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" :
"MongoDB 教程", "description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)", "by" : "菜鳥(niǎo)教程",
"url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }
MongoDB (>) 大于操作符 - $gt
如果你想獲取 "col" 集合中 "likes" 大于 100 的數(shù)據(jù),你可以使用以下命令:
db.col.find({likes : {$gt : 100}})
類似于SQL語(yǔ)句:
Select * from col where likes > 100;
輸出結(jié)果:
> db.col.find({likes : {$gt : 100}})
{ "_id" :
ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" :
"PHP 是一種創(chuàng)建動(dòng)態(tài)交互性站點(diǎn)的強(qiáng)有力的服務(wù)器端腳本語(yǔ)言。", "by" : "菜鳥(niǎo)教程", "url" :
"http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 }
{
"_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程",
"description" : "Java 是由Sun Microsystems公司于1995年5月推出的高級(jí)程序設(shè)計(jì)語(yǔ)言。", "by" :
"菜鳥(niǎo)教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" :
150 }
>
MongoDB(>=)大于等于操作符 - $gte
如果你想獲取"col"集合中 "likes" 大于等于 100 的數(shù)據(jù),你可以使用以下命令:
db.col.find({likes : {$gte : 100}})
類似于SQL語(yǔ)句:
Select * from col where likes >=100;
輸出結(jié)果:
> db.col.find({likes : {$gte : 100}})
{ "_id" :
ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" :
"PHP 是一種創(chuàng)建動(dòng)態(tài)交互性站點(diǎn)的強(qiáng)有力的服務(wù)器端腳本語(yǔ)言。", "by" : "菜鳥(niǎo)教程", "url" :
"http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 }
{
"_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程",
"description" : "Java 是由Sun Microsystems公司于1995年5月推出的高級(jí)程序設(shè)計(jì)語(yǔ)言。", "by" :
"菜鳥(niǎo)教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" :
150 }
{ "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" :
"MongoDB 教程", "description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)", "by" : "菜鳥(niǎo)教程",
"url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }
>
MongoDB (<) 小于操作符 - $lt
如果你想獲取"col"集合中 "likes" 小于 150 的數(shù)據(jù),你可以使用以下命令:
db.col.find({likes : {$lt : 150}})
類似于SQL語(yǔ)句:
Select * from col where likes < 150;
輸出結(jié)果:
> db.col.find({likes : {$lt : 150}})
{ "_id" :
ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程",
"description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)", "by" : "菜鳥(niǎo)教程", "url" :
"http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }
MongoDB (<=) 小于等于操作符 - $lte
如果你想獲取"col"集合中 "likes" 小于等于 150 的數(shù)據(jù),你可以使用以下命令:
db.col.find({likes : {$lte : 150}})
類似于SQL語(yǔ)句:
Select * from col where likes <= 150;
輸出結(jié)果:
> db.col.find({likes : {$lte : 150}})
{ "_id" :
ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description"
: "Java 是由Sun Microsystems公司于1995年5月推出的高級(jí)程序設(shè)計(jì)語(yǔ)言。", "by" : "菜鳥(niǎo)教程", "url"
: "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 }
{ "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程",
"description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)", "by" : "菜鳥(niǎo)教程", "url" :
"http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }
MongoDB 使用 (<) 和 (>) 查詢 - $lt 和 $gt
如果你想獲取"col"集合中 "likes" 大于100,小于 200 的數(shù)據(jù),你可以使用以下命令:
db.col.find({likes : {$lt :200, $gt : 100}})
類似于SQL語(yǔ)句:
Select * from col where likes>100 AND likes<200;
輸出結(jié)果:
> db.col.find({likes : {$lt :200, $gt : 100}})
{ "_id"
: ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程",
"description" : "Java 是由Sun Microsystems公司于1995年5月推出的高級(jí)程序設(shè)計(jì)語(yǔ)言。", "by" :
"菜鳥(niǎo)教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" :
150 }
>
MongoDB 查詢文檔
MongoDB $type 操作符
2 篇筆記 寫(xiě)筆記
Mrt.L
903***165@qq.com
一些簡(jiǎn)寫(xiě)說(shuō)明:
$gt -------- greater than >
$gte --------- gt equal >=
$lt -------- less than <
$lte --------- lt equal <=
$ne ----------- not equal !=
$eq -------- equal =
Mrt.L
Mrt.L
903***165@qq.com
2年前 (2017-07-12)
最初的夢(mèng)想
660***09@qq.com
模糊查詢
查詢 title 包含"教"字的文檔:
db.col.find({title:/教/})
查詢 title 字段以"教"字開(kāi)頭的文檔:
db.col.find({title:/^教/})
查詢 titl e字段以"教"字結(jié)尾的文檔:
db.col.find({title:/教$/})
MongoDB $type 操作符
描述
在本章節(jié)中,我們將繼續(xù)討論MongoDB中條件操作符 $type。
$type操作符是基于BSON類型來(lái)檢索集合中匹配的數(shù)據(jù)類型,并返回結(jié)果。
MongoDB 中可以使用的類型如下表所示:
我們使用的數(shù)據(jù)庫(kù)名稱為"runoob" 我們的集合名稱為"col",以下為我們插入的數(shù)據(jù)。
簡(jiǎn)單的集合"col":
>db.col.insert({
title: 'PHP 教程',
description: 'PHP 是一種創(chuàng)建動(dòng)態(tài)交互性站點(diǎn)的強(qiáng)有力的服務(wù)器端腳本語(yǔ)言。',
by: '菜鳥(niǎo)教程',
url: 'http://www.runoob.com',
tags: ['php'],
likes: 200
})
>db.col.insert({title: 'Java 教程',
description: 'Java 是由Sun Microsystems公司于1995年5月推出的高級(jí)程序設(shè)計(jì)語(yǔ)言。',
by: '菜鳥(niǎo)教程',
url: 'http://www.runoob.com',
tags: ['java'],
likes: 150
})
>db.col.insert({title: 'MongoDB 教程',
description: 'MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)',
by: '菜鳥(niǎo)教程',
url: 'http://www.runoob.com',
tags: ['mongodb'],
likes: 100
})
使用find()命令查看數(shù)據(jù):
> db.col.find()
{ "_id" :
ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" :
"PHP 是一種創(chuàng)建動(dòng)態(tài)交互性站點(diǎn)的強(qiáng)有力的服務(wù)器端腳本語(yǔ)言。", "by" : "菜鳥(niǎo)教程", "url" :
"http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 }
{
"_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程",
"description" : "Java 是由Sun Microsystems公司于1995年5月推出的高級(jí)程序設(shè)計(jì)語(yǔ)言。", "by" :
"菜鳥(niǎo)教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" :
150 }
{ "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" :
"MongoDB 教程", "description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)", "by" : "菜鳥(niǎo)教程",
"url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }
MongoDB 操作符 - $type 實(shí)例
如果想獲取 "col" 集合中 title 為 String 的數(shù)據(jù),你可以使用以下命令:
db.col.find({"title" : {$type : 2}})
或
db.col.find({"title" : {$type : 'string'}})
輸出結(jié)果為:
{ "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP
教程", "description" : "PHP 是一種創(chuàng)建動(dòng)態(tài)交互性站點(diǎn)的強(qiáng)有力的服務(wù)器端腳本語(yǔ)言。", "by" : "菜鳥(niǎo)教程",
"url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 }
{ "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java
教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高級(jí)程序設(shè)計(jì)語(yǔ)言。",
"by" : "菜鳥(niǎo)教程", "url" : "http://www.runoob.com", "tags" : [ "java" ],
"likes" : 150 }
{ "_id" : ObjectId("5606654fade2f21f36b0313c"),
"title" : "MongoDB 教程", "description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)", "by" :
"菜鳥(niǎo)教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes"
: 100 }
MongoDB Limit與Skip方法
MongoDB Limit() 方法
如果你需要在MongoDB中讀取指定數(shù)量的數(shù)據(jù)記錄,可以使用MongoDB的Limit方法,limit()方法接受一個(gè)數(shù)字參數(shù),該參數(shù)指定從MongoDB中讀取的記錄條數(shù)。
語(yǔ)法
limit()方法基本語(yǔ)法如下所示:
>db.COLLECTION_NAME.find().limit(NUMBER)
實(shí)例
集合 col 中的數(shù)據(jù)如下:
{ "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP
教程", "description" : "PHP 是一種創(chuàng)建動(dòng)態(tài)交互性站點(diǎn)的強(qiáng)有力的服務(wù)器端腳本語(yǔ)言。", "by" : "菜鳥(niǎo)教程",
"url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 }
{ "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java
教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高級(jí)程序設(shè)計(jì)語(yǔ)言。",
"by" : "菜鳥(niǎo)教程", "url" : "http://www.runoob.com", "tags" : [ "java" ],
"likes" : 150 }
{ "_id" : ObjectId("5606654fade2f21f36b0313c"),
"title" : "MongoDB 教程", "description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)", "by" :
"菜鳥(niǎo)教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes"
: 100 }
以下實(shí)例為顯示查詢文檔中的兩條記錄:
> db.col.find({},{"title":1,_id:0}).limit(2)
{ "title" : "PHP 教程" }
{ "title" : "Java 教程" }
>
注:如果你們沒(méi)有指定limit()方法中的參數(shù)則顯示集合中的所有數(shù)據(jù)。
MongoDB Skip() 方法
我們除了可以使用limit()方法來(lái)讀取指定數(shù)量的數(shù)據(jù)外,還可以使用skip()方法來(lái)跳過(guò)指定數(shù)量的數(shù)據(jù),skip方法同樣接受一個(gè)數(shù)字參數(shù)作為跳過(guò)的記錄條數(shù)。
語(yǔ)法
skip() 方法腳本語(yǔ)法格式如下:
>db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
實(shí)例
以下實(shí)例只會(huì)顯示第二條文檔數(shù)據(jù)
>db.col.find({},{"title":1,_id:0}).limit(1).skip(1)
{ "title" : "Java 教程" }
>
注:skip()方法默認(rèn)參數(shù)為 0 。
MongoDB $type 操作符
MongoDB 排序
5 篇筆記 寫(xiě)筆記
天堂人_2008
yan***n_xi@163.com
db.col.find({},{"title":1,_id:0}).limit(2)
補(bǔ)充說(shuō)明:
第一個(gè) {} 放 where 條件,為空表示返回集合中所有文檔。
第二個(gè) {} 指定那些列顯示和不顯示 (0表示不顯示 1表示顯示)。
天堂人_2008
天堂人_2008
yan***n_xi@163.com
2年前 (2017-04-17)
joyran
xin***iyihan@126.com
想要讀取從 10 條記錄后 100 條記錄,相當(dāng)于 sql 中l(wèi)imit (10,100)。
> db.COLLECTION_NAME.find().skip(10).limit(100)
以上實(shí)例在集合中跳過(guò)前面 10 條返回 100 條數(shù)據(jù)。
skip 和 limit 結(jié)合就能實(shí)現(xiàn)分頁(yè)。
joyran
joyran
xin***iyihan@126.com
2年前 (2017-04-20)
dragon
lib***uan_87@126.com
參考地址
補(bǔ)充說(shuō)明skip和limit方法只適合小數(shù)據(jù)量分頁(yè),如果是百萬(wàn)級(jí)效率就會(huì)非常低,因?yàn)閟kip方法是一條條數(shù)據(jù)數(shù)過(guò)去的,建議使用where_limit
在查看了一些資料之后,發(fā)現(xiàn)所有的資料都是這樣說(shuō)的:
不要輕易使用Skip來(lái)做查詢,否則數(shù)據(jù)量大了就會(huì)導(dǎo)致性能急劇下降,這是因?yàn)镾kip是一條一條的數(shù)過(guò)來(lái)的,多了自然就慢了。
這么說(shuō)Skip就要避免使用了,那么如何避免呢?首先來(lái)回顧SQL分頁(yè)的后一種時(shí)間戳分頁(yè)方案,這種利用字段的有序性質(zhì),利用查詢來(lái)取數(shù)據(jù)的方式,可以直接避免掉了大量的數(shù)數(shù)。也就是說(shuō),如果能附帶上這樣的條件那查詢效率就會(huì)提高,事實(shí)上是這樣的么?我們來(lái)驗(yàn)證一下:
這里我們假設(shè)查詢第100001條數(shù)據(jù),這條數(shù)據(jù)的Amount值是:2399927,我們來(lái)寫(xiě)兩條語(yǔ)句分別如下:
b.test.sort({"amount":1}).skip(100000).limit(10) //183ms
db.test.find({amount:{$gt:2399927}}).sort({"amount":1}).limit(10) //53ms
結(jié)果已經(jīng)附帶到注釋了,很明顯后者的性能是前者的三分之一,差距是非常大的。也印證了Skip效率差的理論。
可以聯(lián)系郵箱 libaoyuan_87@126.com,互相學(xué)習(xí)。
dragon
dragon
lib***uan_87@126.com
參考地址
2年前 (2017-09-14)
niuyongjie
niu***gjie@163.com
limit(n) 是用來(lái)規(guī)定顯示的條數(shù),而 skip(n) 是用來(lái)在符合條件的記錄中從第一個(gè)記錄跳過(guò)的條數(shù),這兩個(gè)函數(shù)可以交換使用。
比如:find({},{age:1,_id:0}).limit(2).skip(1),在符合條件的文檔中,要顯示兩條文檔,顯示的位置從跳過(guò)第一條記錄開(kāi)始。這樣不是很好理解。
如果寫(xiě)成 find({},{age:1,_id:0}).skip(1).limit(2),在符合條件的文檔中,先跳過(guò)第一條文檔,然后顯示兩條文檔,這樣比較好理解。
niuyongjie
niuyongjie
niu***gjie@163.com
1年前 (2017-11-26)
doc.z
bin***real@163.com
需要注意的是,此處的skip,sort,和limit三者執(zhí)行順序和位置無(wú)關(guān),但是在聚合aggregate中使用的時(shí)候,具有管道流的特質(zhì),執(zhí)行順序是按照位置關(guān)系順序執(zhí)行的。
MongoDB 排序
MongoDB sort() 方法
在 MongoDB 中使用 sort() 方法對(duì)數(shù)據(jù)進(jìn)行排序,sort() 方法可以通過(guò)參數(shù)指定排序的字段,并使用 1 和 -1 來(lái)指定排序的方式,其中 1 為升序排列,而 -1 是用于降序排列。
語(yǔ)法
sort()方法基本語(yǔ)法如下所示:
>db.COLLECTION_NAME.find().sort({KEY:1})
實(shí)例
col 集合中的數(shù)據(jù)如下:
{ "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP
教程", "description" : "PHP 是一種創(chuàng)建動(dòng)態(tài)交互性站點(diǎn)的強(qiáng)有力的服務(wù)器端腳本語(yǔ)言。", "by" : "菜鳥(niǎo)教程",
"url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 }
{ "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java
教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高級(jí)程序設(shè)計(jì)語(yǔ)言。",
"by" : "菜鳥(niǎo)教程", "url" : "http://www.runoob.com", "tags" : [ "java" ],
"likes" : 150 }
{ "_id" : ObjectId("5606654fade2f21f36b0313c"),
"title" : "MongoDB 教程", "description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)", "by" :
"菜鳥(niǎo)教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes"
: 100 }
以下實(shí)例演示了 col 集合中的數(shù)據(jù)按字段 likes 的降序排列:
>db.col.find({},{"title":1,_id:0}).sort({"likes":-1})
{ "title" : "PHP 教程" }
{ "title" : "Java 教程" }
{ "title" : "MongoDB 教程" }
>
MongoDB Limit與Skip方法
MongoDB 索引
1 篇筆記 寫(xiě)筆記
niuyongjie
niu***gjie@163.com
skip(), limilt(), sort()三個(gè)放在一起執(zhí)行的時(shí)候,執(zhí)行的順序是先 sort(), 然后是 skip(),最后是顯示的 limit()。
MongoDB 索引
索引通常能夠極大的提高查詢的效率,如果沒(méi)有索引,MongoDB在讀取數(shù)據(jù)時(shí)必須掃描集合中的每個(gè)文件并選取那些符合查詢條件的記錄。
這種掃描全集合的查詢效率是非常低的,特別在處理大量的數(shù)據(jù)時(shí),查詢可以要花費(fèi)幾十秒甚至幾分鐘,這對(duì)網(wǎng)站的性能是非常致命的。
索引是特殊的數(shù)據(jù)結(jié)構(gòu),索引存儲(chǔ)在一個(gè)易于遍歷讀取的數(shù)據(jù)集合中,索引是對(duì)數(shù)據(jù)庫(kù)表中一列或多列的值進(jìn)行排序的一種結(jié)構(gòu)
createIndex() 方法
MongoDB使用 createIndex() 方法來(lái)創(chuàng)建索引。
注意在 3.0.0 版本前創(chuàng)建索引方法為 db.collection.ensureIndex(),之后的版本使用了 db.collection.createIndex() 方法,ensureIndex() 還能用,但只是 createIndex() 的別名。
語(yǔ)法
createIndex()方法基本語(yǔ)法格式如下所示:
>db.collection.createIndex(keys, options)
語(yǔ)法中 Key 值為你要?jiǎng)?chuàng)建的索引字段,1 為指定按升序創(chuàng)建索引,如果你想按降序來(lái)創(chuàng)建索引指定為 -1 即可。
實(shí)例
>db.col.createIndex({"title":1})
>
createIndex() 方法中你也可以設(shè)置使用多個(gè)字段創(chuàng)建索引(關(guān)系型數(shù)據(jù)庫(kù)中稱作復(fù)合索引)。
>db.col.createIndex({"title":1,"description":-1})
>
createIndex() 接收可選參數(shù),可選參數(shù)列表如下:
實(shí)例
在后臺(tái)創(chuàng)建索引:
db.values.createIndex({open: 1, close: 1}, {background: true})
通過(guò)在創(chuàng)建索引時(shí)加 background:true 的選項(xiàng),讓創(chuàng)建工作在后臺(tái)執(zhí)行
1、查看集合索引
db.col.getIndexes()
2、查看集合索引大小
db.col.totalIndexSize()
3、刪除集合所有索引
db.col.dropIndexes()
4、刪除集合指定索引
db.col.dropIndex("索引名稱")
onroad
onroad
liu***910612@126.com
5個(gè)月前 (11-20)
靈仙羽圣
664***680@qq.com
參考地址
利用 TTL 集合對(duì)存儲(chǔ)的數(shù)據(jù)進(jìn)行失效時(shí)間設(shè)置:經(jīng)過(guò)指定的時(shí)間段后或在指定的時(shí)間點(diǎn)過(guò)期,MongoDB 獨(dú)立線程去清除數(shù)據(jù)。類似于設(shè)置定時(shí)自動(dòng)刪除任務(wù),可以清除歷史記錄或日志等前提條件,設(shè)置 Index 的關(guān)鍵字段為日期類型 new Date()。
例如數(shù)據(jù)記錄中 createDate 為日期類型時(shí):
設(shè)置時(shí)間180秒后自動(dòng)清除。
設(shè)置在創(chuàng)建記錄后,180 秒左右刪除。
db.col.createIndex({"createDate": 1},{expireAfterSeconds: 180})
由記錄中設(shè)定日期點(diǎn)清除。
設(shè)置 A 記錄在 2019 年 1 月 22 日晚上 11 點(diǎn)左右刪除,A 記錄中需添加 "ClearUpDate": new Date('Jan 22, 2019 23:00:00'),且 Index中expireAfterSeconds 設(shè)值為 0。
db.col.createIndex({"ClearUpDate": 1},{expireAfterSeconds: 0})
其他注意事項(xiàng):
索引關(guān)鍵字段必須是 Date 類型。
非立即執(zhí)行:掃描 Document 過(guò)期數(shù)據(jù)并刪除是獨(dú)立線程執(zhí)行,默認(rèn) 60s 掃描一次,刪除也不一定是立即刪除成功。
單字段索引,混合索引不支持。