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