07 mongodb

mongodb

mongodb簡介

簡介

    MongoDB是一個基於分佈式文件存儲的數據庫。由C++語言編寫。旨在爲Web應用提供可擴展的高性能數據存儲解決方案。
    MongoDB是一個介於關係數據庫和非關係數據庫之間的產品,是非關係數據庫當中功能最豐富,最像關係數據庫的。它支持的數據結構很是鬆散,是相似json的bson格式,所以能夠存儲比較複雜的  數據類型。Mongo最大的特色是它支持的查詢語言很是強大,其語法有點相似於面向對象的查詢語言,幾乎能夠實現相似關係數據庫單表查詢的絕大部分功能,並且還支持對數據創建索引。python

    下載mongodb:downloadmongodb

mongodb優點

  • 事務支持:目前支持單文檔事務,須要復瑣事務支持的場景暫時不適合。
  • 靈活的文檔模型:JSON格式存儲最接近真實對象模型,對開發者友好,方便快速開發迭代。
  • 高可用複製集:知足數據高可靠、服務高可用的需求,運維簡單,故障自動切換
  • 可擴展分片集羣:海量數據存儲,服務能力水平擴展
  • 高性能:mmapv一、wiredtiger、mongorocks(rocksdb)、in-memory等多引擎支持知足各類場景需求
  • 強大的索引支持:地理位置索引用於構建各類O2O應用、文本索引解決搜索的需求、TTL索引解決數據自動過時的需求
  • Gidfs:解決文件存儲的需求
  • aqqreqation & mapreduce:解決數據分析場景需求,用戶能夠本身寫查詢語句或腳本,將請求都分發到MongoDB上完成

數據庫操做

# 添加數據庫
> use 數據庫名

# 展現數據庫
> show dbs  # 當數據庫無集合,則數據庫不會展現出來

# 刪除數據庫
> db.dropDatabase()

集合操做

> use blog

# 建立集合並插入文檔
> db.article.insert({"title":"python"})

# 展現集合
> show tables

# 刪除集合
> db.article.drop()

文檔操做

添加文檔

    _id若是沒有指定則默認ObjectId, _id不能重複,且在插入後不可變。數據庫

# 插入單條:insert()
user0={
    "name":"ethan",
    "age":10,
    'hobbies':['music','read','dancing'],
    'addr':{
        'country':'China',
        'city':'SZ'
    }
}

> db.test.insert(user0)


# 插入多條:insertMany([])
user1={
    "_id":1,
    "name":"ethan",
    "age":10,
    'hobbies':['music','read','dancing'],
    'addr':{
        'country':'China',
        'city':'SZ'
    }
}
 

user2={
    "_id":2,
    "name":"Tom",
    "age":20,
    'hobbies':['music','read','run'],
    'addr':{
        'country':'China',
        'city':'BJ'
    }
}
 
 
user3={
    "_id":3,
    "name":"Linda",
    "age":30,
    'hobbies':['music','drink'],
    'addr':{
        'country':'China',
        'city':'SH'
    }
}


user4={
    "_id":4,
    "name":"Jhon",
    "age":40,
    'hobbies':['music','read','dancing','tea'],
    'addr':{
        'country':'China',
        'city':'BJ'
    }
}
 

user5={
    "_id":5,
    "name":"Jay",
    "age":50,
    'hobbies':['music','read',],
    'addr':{
        'country':'China',
        'city':'henan'
    }
}


> db.user.insertMany([user1, user2, user3])

查看文檔

1 比較運算json

  • SQL:                 =               !=            >        <         >=           <=
  • MongoDB:   {key:value}    "$ne"      "$gt"    "$lt"     "$gte"       "$lte"

    其中"$ne"能用於全部數據類型數組

# 1. select * from db.user where name = "ethan";
> db.user.find({"name": "ethan"})

# 2. select * from db.user where name != "ethan";
> db.user.find({"name": {"$ne": "ethan"}})

# 3. select * from db.user where id > 2;
> db.user.find({"_id": {"$gt": 2}})

# 4. select * from db.user where id < 3;
> db.user.find({"_id": {"$lt": 3}})

# 5. select * from db.user where id >= 2;
> db.user.find({"_id": {"$gte": 2}})

# 6. select * from db.user where id <= 2;
> db.user.find({"_id": {"$lte": 2}})

2 邏輯運算服務器

  • SQL: and,  or,  not
  • MongoDB:字典中逗號分隔的多個條件是and關係,  "$or",  "$not"
# 1. select * from db.user where id >= 2 and id < 4;
> db.user.find({"_id": {"$gte": 2, "$lt": 4}})

# 2. select * from db.user where id >= 2 and age < 40;
> db.user.find({"_id": {"$gte": 2}, "age": {"$lt": 40}})

# 3. select * from db.user where id >= 5 or name = "ethan";
> db.user.find({"$or": [{"_id": {"$gte": 5}, {"name": "ethan"}}]})

# 4. select * from db.user where id % 2 = 1;
> db.user.find({"_id": {"$mod": [2, 1]}})

# 5. select * from db.user where id % 2 != 1;
> db.user.find("_id": {"$not": {"$mod": [2, 1]}})

3 成員運算數據結構

  • SQL: in,  not in 
  • MongoDB:"$in",  "$nin"
# 1. select * from db.user where age in (20, 30, 31);
> db.user.find({"age": [20, 30, 31]})

# 2. select * from db.user where name not in ("ethan", "Tom");
> db.user.find({"name": {"$nin": ["ethan", "Tom"]}})

4 正則匹配運維

  • SQL: regexp 正則
  • MongoDB:/正則表達/i(i表明模式)
# 1. select * from db.user where name regexp "^e.*?(g|n)$";
> db.user.find({"name": /^e.*?(g|n)$/i})

5 取指定字段分佈式

# 1. select name, age from db.user where id=3;
> db.user.find({"_d":3},{"name":1, "age":1})  # 1表明顯示

# 2. select _id,name,age,hobbies from db.user where id=3;
> db.user.find({"_id":3}, {"addr": 0})  # 0表明不顯示

6 查詢數組性能

# 1.查看有dancing愛好的人
> db.user.find({"hobbies":'dancing'})

# 2.查看既有dancing愛好又有tea愛好的人
> db.user.find({"hobbies":{"$all":["dancing", "tea"]}})

# 3.查看第4個愛好爲tea的人
> db.user.find({"hobbies.3":'tea'})

# 4.查看全部人最後兩個愛好
> db.user.find({},{"hobbies":{"$slice":-2},"_id":0,"age":0,"name":0,"addr":0})

# 5.查看全部人的第2個到第3個愛好
> db.user.find({}, {'hobbies':{"$slice":[1,2]},"age":0,"_id":0,"name":0,"addr":0}})

7 排序

    1表明升序,-1表明降序

> db.user.find().sort({"name":1})

> db.user.find().sort({"age":-1, "_id":1})

8 分頁

    limit表明取多少個document,skip表明跳過前多少個document。

> db.user.find().sort({"age":1}).limit(1).skip(2)

9 查詢數量

# 獲取數量
> db.user.count({"age":{"$gt":30}})

> db.user.find({"age":{"$gt":30}}).count()

10 其它

db.t2.insert({"a":10, "b":111})
db.t2.insert({"a":20})
db.t2.insert({"b":null})

# 1. {"key":null}匹配key的值爲null或者沒有這個key
> db.t2.find({"b":null})
{ "_id" : ObjectId("5c7f1d4cec2776e87cacfd71"), "a" : 20 }
{ "_id" : ObjectId("5c7f1d5aec2776e87cacfd72"), "b" : null }


# 2. 查找全部
> db.user.find()  # 等同於db.user.find({})
> db.user.find().pretty()  # 顯示格式不同

# 3. 查找一個,與find用法一致,只是只取匹配成功的第一個
db.user.findOne({"_id":{"$gt":3}})

修改文檔

    update()方法用於更新已存在的文檔。

    更新操做是不可分割的,若兩個更新同時發送,先到達服務器的先執行,而後執行另一個,不會破壞文檔。

# 語法
db.collection.update(
   <query>,
   <update>,
   {
     upsert: <boolean>,
     multi: <boolean>,
     writeConcern: <document>
   }
)

    參數說明:update db.t1 set name="ethan", gender='Male' where name="ETHAN" and age=18;

  • query:至關於where條件。
  • update:至關於set後面的。
  • upsert:可選,默認爲false,表明若是query不存在,update的記錄不更新也不插入,設置爲true時,若是query不存在則插入。
  • multi:可選,默認爲false,表明只更新找到的第一條記錄,設爲true,表明更新找到的所有記錄。 
  • writeConcern:可選,拋出異常的級別

1 覆蓋更新

# 注意:除非是刪除,不然_id是始終不會變的

# 1.覆蓋原來的記錄
db.user.update({"age":20}, {"name":"Wxx", "hobbies_count":3})


# 2. 一種最簡單的更新就是用一個新的文檔徹底替換匹配的文檔。這適用於大規模式遷移的狀況。
> var obj = db.user.findOne("_id":2)

> obj.username = obj.name + "SB"

> obj.hobbies_count++

> delete boj.age

> db.user.update({"_id":2}, obj)

2  局部更新

    一般文檔只會有一部分須要更新。可使用原子性的更新修改器,指定對文檔中的某些字段進行更新。

    更新修改器是種特殊的鍵,用來指定複雜的更新操做,好比修改、增長或者刪除

# 設置:$set     默認只更改匹配的第一條

# 1. update db.user set name="WXX" where id = 2;
> db.user.update({"_id":2}, {"$set":{"name":"WXX"}})

# 2. 沒有匹配成功則新增一條{"upsert":true}
> db.user.update({"_id":6},{"$set":{"name":"Tim", "age":18}}, {"upsert":true})

# 3. 默認只改匹配成功的第一條,改多條:{"multi":true}
> db.user.update({"_id":{"$gt":4}}, {"$set":{"age":28}},{"multi":true})

# 4.修改內嵌文檔,把名字爲ethan的人所在的址址國家改爲Japan
> db.user.update({"name":"ethan"},{"$set":{"addr.country":"Japan"}})

# 5. 把名字爲ethan的人的第2個愛好改爲swimming
> db.user.update({"name":"ethan"}, {"$set":{"hobbies.1":"swimming"}})

#刪除:$unset
# 6. 刪除ethan的愛好 > db.user.update({"name":"ethan"}, {"$unset":{"hobbies":""}})

3 自增或自減

# 增長和減小:$inc

# 1. 全部人的年齡增長一歲
> db.user.update({},{"$inc":{"age":1}},{"multi":true})


# 2. 全部人年齡減小5歲
> db.user.update({},{"$inc":{"age":-5}},{"multi":true})

4 添加刪除數組內元素

往組內添加元素:$push

# 1. 爲名字爲ethan的人添加一個愛好read
> db.user.update({"name":"ethan"},{"$push":{"hobbies":"read"}})

# 2. 爲名字爲ethan的人一次添加多個愛好tea, dancing
> db.user.update({"name":"ethan"},{"$push":{"hobbies":{"$each":["tea","dancing"]}}})

按照位置且只能從開頭或結尾刪除元素:$pop

# 3. 從數組末尾刪除一個元素:{"$pop":{"key":1]}
> db.user.update({"name":"ethan"},{"$pop":{"hobbies":1}})

# 4. 從數組頭部刪除一個元素:{"$pop":{"key":-1}}
> db.user.update({"name":"ethan"},{"$pop":{"hobbies":-1}})

按照條件,把符合條件的通通刪掉:$pull

# 5.
> db.user.update({"addr.country":"China"},{"$pull":{"hobbies":"read"}},{"multi":true})

5 避免重複添加

避免重複添加:$addToSet

> db.urls.insert({"_id":1,"urls":[]})


> db.urls.update({"_id":1},{"$addToSet":{"urls":{"$each":["http://www.baidu.com","http://www.baidu.com","http://www.baidu.com"]}}})

6 其它

# 1. 限制大小,只留最後n個:$slice
> db.user.update({"_id":5},{"$push":{"hobbies":{"$each":["read", "music", "dancing"], "$slice":-2}}})


# 2. 排序:$sort  (element value must be either 1 or -1)
> db.user.update({"_id":5},{
    "$push":{"hobbies":{
        "$each":["read",'music','dancing'],
        "$slice":-1,
        "$sort":-1
    }
    }
})

# 注意:不能只將"$slice"或者"$sort"與"$push"配合使用,且必須使用"$each"

刪除文檔

# 1. 刪除多箇中的第一個
> db.user.deleteOne({"age":8})

# 2. 刪除國家爲China的所有
> db.user.deleteMany({"addr.country":"China"})

# 3. 刪除所有
> db.user.deleteMany({})
相關文章
相關標籤/搜索