梭哈Mongodb常用操作

本文首發於博主公衆號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,則返回了 _idname 。在不考慮_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字段的非重複的數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章