本文首發於博主公衆號LISTONE,歡迎關注哦!
Mongodb簡介
Mongodb是一種非關係性數據庫(nosql)。
MongoDB 是一個基於分佈式文件存儲的數據庫。由 C++ 語言編寫。旨在爲 WEB 應用提供可擴展的高性能數據存儲解決方案。MongoDB 是一個介於關係數據庫和非關係數據庫之間的產品,是非關係數據庫當中功能最豐富,最像關係數據庫的。
下面是sql與mongodb術語對比:
SQL | Mongodb |
---|---|
表(Talbe) | 集合(Collection) |
行(Row) | 文檔(Document) |
列(Col) | 字段(Field) |
主鍵(Primary Key) | 對象ID(ObjectID) |
索引(Index) | 索引(Index) |
嵌套表(Embeded Table) | 嵌入式文檔(Embeded Document) |
數組(Array) | 數組(Array) |
MongoDB 將數據存儲爲一個文檔,數據結構由鍵值(key=>value)對組成。
{"name": "listone", "age": 22}
以上文檔中有一個name鍵,其值爲 listone
,age鍵值爲 22
。
以這個文檔爲例,解釋一下:
- 文檔中的鍵值對是有序的,上面例子中如果調換name和age的鍵值對,將會被視爲一個新的文檔。
- 文檔中的值不僅僅只限於字符串形式,還有其他更高級的類型。
- 文檔的鍵使用
UTF-8
字符。其中.
和$
通常被保留,只有在特定環境下使用,_
也是保留的。
集合是文檔集,其區別於關係數據庫的表。並且集合是無模式的,即不同類型的文檔可以共存於同一個集合中:
{"name": "listone", "age": 22}
{"book": "The old man and the Sea"}
上面的文檔是完全不同的兩個文檔。既然一個集合可以容納各種類型,爲何需要多集合?
使用多集合的意義在於:
- 降低熵值。即減少混亂程度。
- 速度上的優越性。把一個特定類型的文檔分成多個子集合提高查詢效率。
- 把同種類型的文檔存在一個集合彙總,使數據更集中。
Mongodb數據庫操作
創建數據庫
use DATABASE_NAME
如果數據庫不存在,則創建數據庫,否則切換到指定數據庫。
- 查看所有數據庫
show dbs
刪除數據庫
db.dropDatabase()
刪除當前數據庫,默認爲 test,你可以使用 db 命令查看當前數據庫名。
創建集合
db.createCollection("listone")
- 查看已有集合
show collections
show tables
刪除集合
db.collection.drop()
命令中collection替換爲要刪除的集合名稱
插入文檔
db.COLLECTION_NAME.insert(document)
db.COLLECTION_NAME.insertOne(document)
db.COLLECTION_NAME.insertMany(document_list)
- 示例
>db.listone.insert({name:'listone',
age:22
})
>db.listone.insertOne({name:'li',
age:22
})
>db.listone.insertMany([
{name:'stone',age:28},
{name:'st',age:21}
])
>db.listone.find()
{ "_id" : ObjectId("5e7b83432e8c80cabc4a93c6"), "name" : "listone", "age" : 22 }
{ "_id" : ObjectId("5e7b85082e8c80cabc4a93c7"), "name" : "li", "age" : 22 }
{ "_id" : ObjectId("5e7b85592e8c80cabc4a93c8"), "name" : "stone", "age" : 28 }
{ "_id" : ObjectId("5e7b85592e8c80cabc4a93c9"), "name" : "st", "age" : 21 }
查詢數據
查詢所有數據
db.getCollection('listone').find({})
其中{}裏面包含的是查詢條件,因爲是查詢所有的數據,所以直接爲空就行了,或者省略{}也行。
查詢特定數據
db.getCollection('listone').find({"字段1":"固定值1","字段2":"固定值2"})
db.getCollection('listone').find({name:'listone'})
查詢範圍值數據
db.getCollection('listone').find(
{
"字段1":{"操作符1":邊界1,"操作符2":邊界2},
"字段2":{"操作符1":邊界1,"操作符2":邊界2}
}
)
db.getCollection('listone').find({age:{"$gt":22}})
和前面查詢特定的數據的方法一樣,只不過固定值變成了範圍({"$gt":22}代表大於22)
操作符及其意義:
操作符 | 意義 |
---|---|
$gt | 大於(great than) |
$gte | 大於等於(great than equal) |
$lt | 小於(less than) |
$lte | 小於等於(less than equal) |
$ne | 不等於(not equal) |
限定返回字段
前面的示例中都返回了所有的字段,下面我們將對某些不需要的字段進行篩選。
db.getCollection('listone').find(用於過濾的條件,用於限定的條件)
- 去除age
db.getCollection('listone').find({age:{"$gt":22}},{"age":0})
- 只返回age
db.getCollection('listone').find({age:{"$gt":22}},{"age":1})
大家會發現,在後面的用於限定的條件中,如果age爲1,則返回了 age 和 _id ,如果age爲0,則返回了 _id 和 name 。在不考慮_id的情況下,我們可以理解:
如果某一個字段被限定爲0,則代表該字段不返回(也就是默認其它字段爲1),所以其他未被限定的字段則一定會被返回
如果某一個字段被限定爲1,則代表該字段返回(也就是默認其它字段爲0),所以其他未被限定的字段則不會被返回
修飾返回結果
- 得到數據的條數
db.getCollection('listone').find({}).count()
- 限定返回結果數量
db.getCollection('test_data_1').find({}).limit(限制返回的數量)
- 對結果進行排序
db.getCollection('test_data_1').find({}).sort({"字段名":-1或者1})
其中-1爲逆序,1爲正序。
修改數據
- updateOne:只更新第一條符合條件的數據
- updateMany:更新所有符合條件的數據
使用updateMany更新數據
db.getCollection('listone').updateMany(
// 下面是查詢條件
{
"字段名1":"查找條件1","字段名2":"查找條件2"
},
// 進行修改
{
"$set":{"字段名":"新的數據","字段名":"新的數據"}
}
)
刪除數據
- deleteOne
- deleteMany
db.getCollection('listone').deleteMany(
// 刪除的條件
{
"字段名1":"值","字段名2":"值2"
}
)
數據去重
db.getCollection('test_data_1').distinct(去重的字段名,去重的條件)
示例:
db.getCollection('listone').distinct("name",{"age":{"$ne":22}})
這個的含義就是,在age不等於22的條件下對name字段進行去重。返回的數據是一個數組,裏面是去重後的表中name字段的非重複的數據。