MongoDB 操作
MongoDB
MongoDB是一個提供了高性能、高可用及自動伸縮功能的開源的文檔數據庫(Document Database),由C++語言編寫。旨在為web應用提供可擴展的高性能數據存儲解決方案
文檔數據庫
在MongoDB中一條記錄就是一個文檔,文檔本身類似于JSON對象,其數據結構是組合的鍵值對。
文檔的優勢在于:
1) 文檔可以對應到許多編程語言內置的數據類型
2) 內嵌的文檔和數組結構減少了跨表查詢
3) 自由的表結構支持流暢的多態
MongoDB特點
1、模式自由:可以把不同結構的文檔存儲在同一個數據庫里
2、面向集合的存儲:適合存儲JSON風格文件的形式
3、完整的索引支持:對任何屬性可索引
4、復制和高可用:支持服務器間的數據復制,支持主-從模式
5、自動分片:自動分片功能支持水平的數據庫集群,可動態添加額外的機器
6、豐富的查詢:支持豐富的查詢表達式,查看指令使用JSON形式的標記,可輕易查詢文檔中的內嵌對象及數組
7、快速就地更新:查詢優化器會分析查詢表達式,并生成一個高效的查詢計劃
8、高效的傳統存儲方式:支持二進制數據及大型對象(如照片或圖片)
MongoDB基本概念
1、數據庫 database
2、集合 collection,類似于數據表
3、文檔 document, 類似于記錄
4、字段 field,類似于字段
配置文件其他選項說明 :
數據庫基本操作
1、查看數據庫
> show dbs
admin 0.000GB
local 0.000GB
2、查看當前數據庫
> db
game
> db.getName()
game
3、創建數據庫
> use <db_name>
數據庫如果存在,則為切換數據庫,否則為創建數據庫
> use game
switched to db game
> show dbs
admin 0.000GB
local 0.000GB
此時使用show dbs命令查看不到game庫,因為game庫中沒有數據;可通過以下方式在game庫中創建一個集合tb01
> use game
switched to db game
> db.createCollection("tb01")
{ "ok" : 1 }
> show dbs
admin 0.000GB
game 0.000GB
local 0.000GB
4、刪除當前使用的數據庫
> db.dropDatabase()
{ "dropped" : "game", "ok" : 1 }
> show dbs
admin 0.000GB
local 0.000GB
5、查看當前數據庫狀態
> db.stats()
{
"db" : "game",
"collections" : 1,
"views" : 0,
"objects" : 0,
"avgObjSize" : 0,
"dataSize" : 0,
"storageSize" : 4096,
"numExtents" : 0,
"indexes" : 1,
"indexSize" : 4096,
"ok" : 1
}
6、顯示數據庫版本
> db.version()
3.4.3
7、查看數據庫當前監聽地址
> db.getMongo()
connection to 127.0.0.1:27017
集合collection相關操作
1、查看數據庫中的集合
> use game
switched to db game
> show collections
tb01
2、創建集合
語法:
db.createCollection(name, { size : ..., capped : ..., max : ... } )
name:集合名稱
capped:指定為true時,表示創建上限集合(即當集合中文檔數量達到一定量時,會覆蓋舊的文檔),此參數為true時,需要指定size參數
size:指定該集合中文檔的大小,以Byte為單位
max:指定該集合中最大文檔數量
> db.createCollection("tb02")
{ "ok" : 1 }
> db.createCollection("tb03",{capped: true, size: 100000, max: 10000})
{ "ok" : 1 }
> show collections
tb01
tb02
tb03
向一個不存在的集合中插入文檔時,也會自動創建該集合
> db.tb04.insert({"name": "martin", "age": 20})
> show collections
tb01
tb02
tb03
tb04
3、獲取指定名稱的集合
> db.getCollection("tb01")
game.tb01
> db.getCollection("tb02")
game.tb02
4、查看當前數據庫中所有集合名稱
> db.getCollectionNames()
[ "tb01", "tb02", "tb03", "tb04" ]
5、刪除集合
> db.tb01.drop()
true
> db.tb02.drop()
true
文檔增、刪、改、查
MongoDB支持許多數據類型
字符串 - 這是用于存儲數據的最常用的數據類型。MongoDB中的字符串必須為UTF-8。
整型 - 此類型用于存儲數值。 整數可以是32位或64位,具體取決于服務器。
布爾類型 - 此類型用于存儲布爾值(true / false)值。
雙精度浮點數 - 此類型用于存儲浮點值。
最小/最大鍵 - 此類型用于將值與最小和最大BSON元素進行比較。
數組 - 此類型用于將數組或列表或多個值存儲到一個鍵中。
時間戳 - ctimestamp,當文檔被修改或添加時,可以方便地進行錄制。
對象 - 此數據類型用于嵌入式文檔。
對象 - 此數據類型用于嵌入式文檔。
Null - 此類型用于存儲Null值。
符號 - 該數據類型與字符串相同; 但是,通常保留用于使用特定符號類型的語言。
日期 - 此數據類型用于以UNIX時間格式存儲當前日期或時間。您可以通過創建日期對象并將日,月,年的日期進行指定自己需要的日期時間。
對象ID - 此數據類型用于存儲文檔的ID。
二進制數據 - 此數據類型用于存儲二進制數據。
代碼 - 此數據類型用于將JavaScript代碼存儲到文檔中。
正則表達式 - 此數據類型用于存儲正則表達式。
1、插入文檔
語法1):
> db.<collection_name>.insert(document)
示例:
> db.tb01.insert({id:001, name: "martin", description: "test"})
WriteResult({ "nInserted" : 1 })
> db.tb01.insert({
... _id: 100,
... title: "MongoDB Overview",
... description: "MongoDB is no sql database",
... by: "martin",
... url: "www.martin.com",
... tags: ["mongodb","database","NoSQL"],
... likes: 100
... })
WriteResult({ "nInserted" : 1 })
>
在插入文檔時如果不指定_id,則mongoDB會為此文檔生成一個唯一的objectID
同時插入多個文檔
> db.tb01.insert([
... {
... _id: 101,
... title: "MongoDB Guide",
... description: "MongoDB is no sql database",
... by: "martin",
... url: "www.martin.com",
... tags: ["mongodb","database","NoSQL"],
... likes: 100
... },
...
... {
... _id: 102,
... title: "NoSQL Database",
... description: "NoSQL database doesn't have tables",
... by: "martin",
... url: "www.martin.com",
... tags: ["mongodb","database","NoSQL"],
... likes: 210,
... comments: [
... {
... user: "user1",
... message: "My first comment",
... dateCreated: new Date(2017,12,5,19,24),
... like: 0
... }
... ]
... },
...
... {
... _id: 103,
... title: "Python Quick Guide",
... description: "Python Quick start",
... by: "martin",
... url: "www.martin.com",
... tags: ["Python","database","NoSQL"],
... likes: 30,
... comments: [
... {
... user: "user1",
... message: "My first comment",
... dateCreated: new date(2018,11,10,2,35),
... like: 580
... }
... ]
... }
... ])
語法2):
> db.collection_name.insertOne(document)
此方法會返回一個插入文檔的ObjectID
示例:
> db.inventory.insertOne(
... { item: "canvas", qty: 100, tags: ["cotton"], size: { h: 28, w: 35.5, uom: "cm" }}
... )
{
"acknowledged" : true,
"insertedId" : ObjectId("5a2683e4b4720e8514e971a1")
}
語法3):
> db.collection_name.insertMany(document)
此方法會返回文檔的objectID
> db.inventory.insertMany([
... { item: "journal", qty: 25, tags: ["blank","red"], size: {h: 14, w: 21, uom: "cm"}},
... { item: "mat", qty: 85, tags: ["gray"], size: {h: 27.9, w: 35.5, uom: "cm"}},
... { item: "mousepad", qty: 25, tags: ["gel", "blue"], size: {h: 19, w: 22.85, uom: "cm"}}
... ])
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("5a2684d6b4720e8514e971a2"),
ObjectId("5a2684d6b4720e8514e971a3"),
ObjectId("5a2684d6b4720e8514e971a4")
]
}
>
查詢文檔
語法:
> db.collection_name.find()
該方法以非結構化的方式顯示所有數據,如果想使用結構化方式顯示數據,需要使用pretty()方法
> db.collection_name.find().pretty()
> db.tb01.find().pretty()
mongodb比較運算符的使用:
1、{<key>: <value>} 等于
> db.tb01.find(
... { _id: 103 }
... ).pretty()
2、{<key>: {$lt:<value>}} 小于
> db.tb01.find(
... {_id: {$lt: 102}}
... ).pretty()
3、{<key>: {$lte:<value>}} 小于等于
> db.tb01.find(
... {_id: {$lte: 102}}
... ).pretty()
4、{<key>: {$gt:<value>}} 大于
> db.tb01.find(
... {_id: {$gt: 102}}
... ).pretty()
5、{<key>: {$gte:<value>}} 大于等于
> db.tb01.find(
... { _id: {$gte: 102} }
... ).pretty()
6、{<key>: {$ne:<value>}} 不等于
> db.tb01.find(
... {_id: {$ne: 102}}
... ).pretty()
邏輯運算符的使用
1、AND
語法:
> db.collection_name.find(
{
$and: [
{key: value}, {key: value}
]
}
)
> db.tb01.find(
... {
... $and: [
... { by: "martin" }, { title: "MongoDB Overview" }
... ]
... }
... ).pretty()
{
"_id" : 100,
"title" : "MongoDB Overview",
"description" : "MongoDB is no sql database",
"by" : "martin",
"url" : "www.martin.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
>
2、OR
語法:
> db.collection_name.find(
{
$or: [
{key: value}, {key: value}
]
}
)
> db.tb01.find(
... {
... $or: [
... { title: "MongoDB Overview" }, { title: "MongoDB Guide" }
... ]
... }
... ).pretty()
3、AND/OR同時使用
> db.tb01.find(
... {
... by: "martin",
... $or: [
... { title: "MongoDB Overview" }, { title: "MongoDB Guide" }
... ]
... }
... ).pretty()
顯示指定字段的數據(投影)
> db.collection_name.find({},{key:1,key:1,...})
MongoDB的find()方法,其中第二個參數表示顯示指定字段的數據,其中上述格式中key為指定的字段名稱,值為1表示僅顯示該字段的數據
> db.inventory.find({},{_id:1, item:1})
{ "_id" : ObjectId("5a2683e4b4720e8514e971a1"), "item" : "canvas" }
{ "_id" : ObjectId("5a2684d6b4720e8514e971a2"), "item" : "journal" }
{ "_id" : ObjectId("5a2684d6b4720e8514e971a3"), "item" : "mat" }
{ "_id" : ObjectId("5a2684d6b4720e8514e971a4"), "item" : "mousepad" }
{ "_id" : ObjectId("5a268f122b720c3680067af1"), "item" : "journal" }
find()方法總是顯示_id字段的數據,如果不想顯示_id字段的數據,則需要把_id設置為0
> db.inventory.find({},{_id:0, item:1})
{ "item" : "canvas" }
{ "item" : "journal" }
{ "item" : "mat" }
{ "item" : "mousepad" }
{ "item" : "journal" }
限制顯示文檔的數量
limit(number)方法
限制 MongoDB 中返回的記錄數,需要使用limit()方法。
該方法接受一個數字類型參數,它表示要顯示的文檔數。
示例:顯示結果集的前三行記錄
> db.inventory.find({},{_id:0, item:1}).limit(3)
{ "item" : "canvas" }
{ "item" : "journal" }
{ "item" : "mat" }
>
skip(number)方法
skip()表示要跳過的記錄數量
示例:跳過結果集的前三行不顯示
> db.inventory.find({},{_id:0, item:1}).skip(3)
{ "item" : "mousepad" }
{ "item" : "journal" }
{ "item" : "notebook" }
{ "item" : "paper" }
{ "item" : "planner" }
{ "item" : "postcard" }
示例:僅顯示第三行記錄
> db.inventory.find({},{_id:0, item:1}).skip(2).limit(1)
{ "item" : "mat" }
>
按字段排序顯示數據
排序顯示數據需要使用sort()方法,語法如下:
> db.collection_name.find().sort({key:1})
其中sort({key:1}),1表示升序,-1表示降序
示例:按item字段升序顯示數據
> db.inventory.find({},{_id:1, item: 1}).sort({item:1})
{ "_id" : ObjectId("5a2683e4b4720e8514e971a1"), "item" : "canvas" }
{ "_id" : ObjectId("5a2684d6b4720e8514e971a2"), "item" : "journal" }
{ "_id" : ObjectId("5a268f122b720c3680067af1"), "item" : "journal" }
{ "_id" : ObjectId("5a2684d6b4720e8514e971a3"), "item" : "mat" }
{ "_id" : ObjectId("5a2684d6b4720e8514e971a4"), "item" : "mousepad" }
示例:按item字段降序顯示數據
> db.inventory.find({},{_id:1, item:1}).sort({item:-1})
{ "_id" : ObjectId("5a268f122b720c3680067af5"), "item" : "postcard" }
{ "_id" : ObjectId("5a268f122b720c3680067af4"), "item" : "planner" }
{ "_id" : ObjectId("5a268f122b720c3680067af3"), "item" : "paper" }
{ "_id" : ObjectId("5a268f122b720c3680067af2"), "item" : "notebook" }
{ "_id" : ObjectId("5a2684d6b4720e8514e971a4"), "item" : "mousepad" }
{ "_id" : ObjectId("5a2684d6b4720e8514e971a3"), "item" : "mat" }
聚合運算操作
示例01:按by_user字段進行分組,并對出現的用戶進行+1操作
> db.article.aggregate(
... [
... { $group: {_id: "$by_user", number: {$sum: 1}} }
... ]
... )
{ "_id" : "Curry", "number" : 1 }
{ "_id" : "Kuber", "number" : 1 }
{ "_id" : "Maxsu", "number" : 2 }
示例02:按by_user進行分組, 并對字段likes進行平均值運算
> db.article.aggregate(
... [
... { $group: {_id: "$by_user", number: {$avg: "$likes"}} }
... ]
... )
{ "_id" : "Curry", "number" : 350 }
{ "_id" : "Kuber", "number" : 750 }
{ "_id" : "Maxsu", "number" : 55 }
>
示例03:按by_user進行分組,并對字段likes計算最小值
> db.article.aggregate(
... [
... { $group: {_id: "$by_user", number: {$min: "$likes"}} }
... ]
... )
{ "_id" : "Curry", "number" : 350 }
{ "_id" : "Kuber", "number" : 750 }
{ "_id" : "Maxsu", "number" : 10 }
>
示例04:按by_user進行分組, 并對字段likes計算最大值
> db.article.aggregate(
... [
... { $group: { _id: "$by_user", number: {$max: "$likes"}} }
... ]
... )
{ "_id" : "Curry", "number" : 350 }
{ "_id" : "Kuber", "number" : 750 }
{ "_id" : "Maxsu", "number" : 100 }
>
示例05:按name字段進行分組,獲取url字段中的第一行記錄
> db.test.aggregate(
... [
... { $group: {_id: "$name", first_url: {$first: "$url"}} }
... ]
... )
{ "_id" : "tom", "first_url" : "www.d.org" }
{ "_id" : "jerry", "first_url" : "www.c.org" }
{ "_id" : "martin", "first_url" : "www.a.org" }
示例06:按name字段進行分組,獲取url字段中最后一行記錄
> db.test.aggregate(
... [
... { $group: {_id: "$name", last_url: {$last: "$url"}} }
... ]
... )
{ "_id" : "tom", "last_url" : "www.d.org" }
{ "_id" : "jerry", "last_url" : "www.c.org" }
{ "_id" : "martin", "last_url" : "www.b.org" }
>
示例07:按name字段進行分組,并將url字段的值以數組的方式顯示,重復項會多次顯示
> db.test.aggregate(
... [
... { $group: {_id: "$name", new_url: {$push: "$url"}} }
... ]
... )
{ "_id" : "tom", "new_url" : [ "www.d.org" ] }
{ "_id" : "jerry", "new_url" : [ "www.c.org" ] }
{ "_id" : "martin", "new_url" : [ "www.a.org", "www.b.org", "www.a.org" ] }
>
示例08:按name字段進行分組,并將url字段的值以數組的方式顯示,重復項僅會顯示一次
> db.test.aggregate(
... [
... { $group: {_id: "$name", new_url: {$addToSet: "$url"}} }
... ]
... )
{ "_id" : "tom", "new_url" : [ "www.d.org" ] }
{ "_id" : "jerry", "new_url" : [ "www.c.org" ] }
{ "_id" : "martin", "new_url" : [ "www.b.org", "www.a.org" ] }
>
更新文檔
mongodb更新文檔可使用update()方法或者save()方法
update()方法用于更新現有文檔中的值
save()方法用于替換現有文檔
> db.tb01.update({ title: "MongoDB Overview" },
... {$set: { title: "New Update MongoDB Overview" }})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
>
update()方法一次只更新一個文檔,如需更新多個,則需要將參數multi設置為true
> db.tb01.update(
... { url: "www.martin.com" },
... { $set: {url: "http://www.martin.com"} },
... { multi: true }
... )
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 3 })
>
>
save()方法直接替換文檔
> db.tb01.save(
... {
... _id: 100, title: "Updated by save() method", by: "martin"
... }
... )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.tb01.save(
... {
... title: "MongoDB Guide", by: "jerry"
... }
... )
WriteResult({ "nInserted" : 1 })
刪除文檔
語法:
> db.collection_name.remove(conditon, justOne=true)
justOne:表示只刪除一條數據
示例01: 刪除作者為martin的文檔
> db.tb01.remove({ by: "martin" })
WriteResult({ "nRemoved" : 4 })
>
> db.tb01.find({ by: "martin" }).pretty()
>
示例02:僅刪除名稱為martin的一條數據
> db.tb01.remove(
... { name: "martin" },
... { justOne: true}
... )
示例03:刪除所有文檔
> db.tb01.remove( {}, {justOne: false})
WriteResult({ "nRemoved" : 2 })
> db.tb01.find().pretty()
>
浙公網安備 33010602011771號