MongoDB

  MongDB 的安裝   連接  html

Windows:http://www.runoob.com/mongodb/mongodb-window-install.htmljava

linux:http://www.runoob.com/mongodb/mongodb-linux-install.htmlpython

1、初識MongoDB

  MongoDB 是一個基於分佈式文件存儲的數據庫。由 C++ 語言編寫。旨在爲 WEB 應用提供可擴展的高性能數據存儲解決方案。mysql

  MongoDB 是一個介於關係數據庫和非關係數據庫之間的產品,是非關係數據庫當中功能最豐富,最像關係數據庫的。linux

  簡單說,MongoDB和咱們使用的關係型數據庫最大的區別就是約束性,能夠說文件型數據庫幾乎不存在約束性,理論上沒有主外鍵約束,沒有存儲的數據類型約束等等。關係型數據庫中有一個 "表" 的概念,有 "字段" 的概念,有 "數據條目" 的概念,MongoDB中也一樣有以上的概念,,可是名稱發生了一些變化,嚴格意義上來講,二者的概念即爲類似,但又有些出入,不過無所謂,咱們就當是以上概念就好啦。 sql

  用以下示例進一步說明:mongodb

  這是咱們用關係型數據庫作的一張很簡單的user表:數據庫

  id   name    age     gender
  1    劉濤     36      female
  2    孫紅雷   40       male
  3    馬伊利   35      female

  在MongoDB的數據結構以下:json

  user = [
    {
      "id": 1,
      "name": "劉濤",
      "age": 36,
      "gender": female
    },
    {
      "id": 2,
      "name": "孫紅雷",
      "age": 40,
      "gender": male
    },
    {
      "id": 3,
      "name": "馬伊利",
      "age": 35,
      "gender": female
    }
  ]

  看到這裏,你發現這不就是一個列表,裏面放着三個字典嗎?你說的對,若是你理解成了列表和字典,那麼證實了你只會Python,在其餘語言中它又是別的類型了,咱們把這種類型叫作Json。數組

  那麼你應該恍然大悟了吧,MongoDB的每一個表(Collection)中存儲的每條數據(Documents)都是一個一個的Json,Json中的每個字段(Key)咱們稱之爲Field,就此咱們引出了三個關鍵字:Collection也就是關係型數據庫中"表"的概念,Documents就是"數據條目",Field就是"字段"。

  接下來在你的電腦上安裝MongoDB,本文以3.4版本爲例,安裝過程一路下一步便可,完成後找到安裝目錄下的bin目錄,將其加入環境變量。

  注意:安裝完成後打開終端,輸入mongod,會顯示以下錯誤信息:

 

 

 

 

 

 

 

 

 

  咱們能夠手動在上述提示目錄,即c盤建立data\db目錄,若不想放在c盤,也能夠在其餘磁盤,如d盤建立,以下:

 

 

 

 

 

 

 

  此時就能夠成功開啓mongodb服務了,且要指定mongodb的數據存放目錄,以下:

 

 

 

 

 

 

 

  開啓服務端後再打開一個終端開啓mongo的客戶端,以下:

 

 

 

 

 

 

 

 

接下來就能夠進行mongodb的操做了,以下圖:

 

 

 

 

 

注意:由上圖咱們發現,mongodb中使用了不存在的對象,就表明建立對象,接下來咱們使用這以結論建立一張表(collection),以下圖:

 

 

 

 

 

 

 

2、MongoDB的數據類型 

 

  ObjectID :Documents 自生成的 _id;
  String: 字符串,必須是utf-8;
  Boolean:布爾值,true 或者false (注意,這裏首字母要小寫);
  Integer:整數 (Int3二、Int64,就知道有個Int就好了,通常咱們用Int32);
  Double:浮點數 (沒有float類型,全部小數都是Double);
  Arrays:數組或者列表,多個值存儲到一個鍵;
  Object:至關於Python中的字典;
  Null:空數據類型;
  Timestamp:時間戳;
  Date:存儲當前日期或時間unix時間格式 (咱們通常不用這個Date類型,時間戳能夠秒殺一切時間類型);

這裏咱們重點說一下ObjectID 類型, 它是MongoDB生成的相似關係DB表主鍵的惟一key, 具體由24個字節組成:

  1-8字節是時間戳;

  9-14字節的機器標識符, 表示MongoDB實例所在機器的不一樣;

  15-18字節的進程id, 表示相同機器的不一樣MongoDB進程;

  19-24字節是計數器;

 

 

    "_id" : ObjectId("5c3ee043949505956bbf9b33")

  #"5c3ee043" 代指的是時間戳,這條數據的產生時間;
  #"949505" 代指某臺機器的機器碼,存儲這條數據時的機器編號;
  #"956b" 代指進程ID,多進程存儲數據的時候,很是有用的;
  #"bf9b33" 代指計數器,這裏要注意的是,計數器的數字可能會出現重複,不是惟一的;
  # 以上四種標識符拼湊成世界上惟一的ObjectID
  # 只要是支持MongoDB的語言,都會有一個或多個方法,對ObjectID進行轉換
  # 注意:這個類型是不能夠被JSON序列化的

3、MongoDB的增刪改查

 1, 插入數據 (insert,  insertOne,  insertMany)

  insert(): 插入一條或者多條數據,  須要帶有容許插入多條的參數, 這個方法目前官方已經不推薦了

 

 

  insertOne({}) : 插入一條數據 , 官方推薦

 

 

 

  insertMany([{}]):插入多條數據,無需參數控制,官方推薦

 

 

 

 

 

 

2, 查詢數據 (find,  findOne)

  find(): 無條件查找,  將該表(Collection) 中全部的數據一次性返回

  findOne():  無條件查找一條數據, 默認當前Collection中第一條數據

 

 

 

 

 

 

 

 

  find({條件}, {排除字段}),  示例以下 :

 

 

 

 

 

 

 

3, 修改數據 (update,  updateOne,  updateMany)

  語法:  update/updateOne/updateMany({條件}, {"關鍵字":{"修改內容"})

  解釋 : 根據條件修改內容, 其中若是條件爲空, 那麼將會修改Collection中全部的數據

  示例: 

  update({"name":"tom"}, {$set:{"age":23}});   表示將表中那麼等於tom 的記錄(documents)  的age字段(field)  改成23 , 與insert同樣,  官方已經不推薦使用

 

 

 

 

 

  updateOne({"age":23},{$set:{"age":24}}) ;  將表中age 等於 23 的記錄(documents) 的age字段(field) 改成24 若是出現多條符合條件的記錄, 只修改最靠前的數據, 3.2 版本以後有的, 官方推薦

 

 

 

 

 

  updateMany({"age":25},{$set:{"age":22}}):將表中age等於25的記錄(documents)的age字段(field)改成22,如出現多條符合條件的記錄,修改全部符合條件的數據,3.2版本以後有的,官方推薦

 

 

 

 

 

4,  刪除數據 (remove,  deleteOne,  deleteMany)

  remove: 刪除知足條件的數據或者刪除所有數據, 官方已經不推薦使用了

 

 

 

 

 

 

  deleteOne: 刪除符合條件的一條數據, 如有多條符合條件,  默認刪除符合條件的第一條,  3.2 版本以後又的, 官方推薦寫法

 

 

 

 

 

 

 

  deleteMany: 刪除符合條件的全部數據, 如有多條符合提哦案件的則所有刪除, 3.2 版本以後有的,官方推薦寫法

 

 

 

 

 

 

5. 查詢表中的數字比較關鍵字  ($lt,  $gt, $lte,  $gte,  $eq)

  $lt : MongoDB中的"<", 用  "$lt"  , 好比: "age" : "age":{$lt:22}  就是獲得"age" 小於22 的數據

 

 

 

  $gt:MongoDB中的">",用"$gt",好比: "age":{$gt:22} 就是獲得"age"大於22的數據

 

 

  $lte : MongoDB中"<="  用  "$lte" ,  好比: "age":{$lte:22}  就是獲得 "age"  小於等於22的數據

 

 

  $gte : MongoDB中的">=" , 用 "$gte" , 好比:"age:{$gte:22}"  就是獲得 "age" 大於等於22 的數據

 

 

  $eq : 咱們在以前的查詢中遇到什麼字段等於什麼值時,  仍是用冒號  " : "  來表示 , 好比 "name":"tom",  除此以外, MongoDB中的 "=", 還能夠用關鍵字  " $eq " 表示, 好比 : "age": {$eq:22}  就是獲得 "age" 等於22的數據, 但一般用冒號 ":"  表示便可,  不能用冒號的可用關鍵字 " $eq"

 

 

6, 查詢條件並列關係,  或($or)關係,  子集($in)關係, 徹底符合($all)關係

  find({"name":"張三", "age"15})

 

 

 

 

 

  find({$or:[{"name":"tom"},{"age":15}]})

 

 

 

 

 

  

  find({"age":{$in:[10,20,30,40]}}) 或者 find({"score":{$in:[55,77,80,91]}})

 

 

 

 

 

 

 

 

  find({"score":{$all:[58,88,79,95]}})   排列不按順序匹配

 

 

 

 

 

 

 7 ,  MongoDB中的那些update修改器 ($inc,  $set,  $unset,  $push,  $pushAll,  $pop)

  在以前的update中, 咱們用過$set 對數據進行修改, 其實在update中還存在不少的$關鍵字,  咱們把update 中這些關鍵字叫作修改器, 修改器不少, 下面結合示例介紹幾個:

  1)  $in : 將查詢到的結果, 加上某一個值, 而後保存

 

 

 

 

 

 

  2)   $set:  暴力修改, 咱們在MongoDB的基本操做中已經使用過該修改器

 

 

 

 

 

  3)  $unset : 用來暴力刪除字段 (field)

 

 

 

 

  4)  $push: 用來對Array 數據類型進行 增長  新元素的, 至關於Python中list.append() 方法

 

 

 

 

 

 

  5)  $pull : 用來對Array數據類型進行  刪除  元素的, 至關於Python中list.remove() 方法

 

 

 

 

  6) $pushAll : 用來對Array數據類型進行  迭代追加,  至關於Python中list.extend() 方法

  7)$pop : 指定刪除Array中的第一個 或 最後一個元素

 

 

 

 

 

 

8 , "$" 符的奇妙用法

  在MongoDB中有一個很是神奇的符號"$", "$" 在update中加上關鍵字就變成了修改器,  其實 "$" 字符獨立出現也是有意義的, 它表明符合條件的元素下標

  有以下collections:

 

 

  現須要把tom的score_list列表中的59改成60,操做以下:

 

 

 

  那麼問題來了,若score_list中元素不少,且不知道要修改的元素索引,只知道修改前的值和修改後的值,此時改如何作呢?沒錯,就是使用"$",以下:

 

 

 

 

 

注意:$中只能存儲一個值,且是符合條件的第一個值。

9,  MongoDB 的Array , Object 的特殊操做

  相比關係型數據庫, Array和Object是MongoDB比較特殊的類型了, 特殊在哪裏呢? 在他們的操做的上又有什麼須要注意的呢?

  咱們先創建一條數據(documents),包含 Array 和 Object 類型:

{
    "_id" : ObjectId("5c406c65456ef1f8f2b06401"),
    "name" : "tom",
    "score" : [
        98,
        95,
        90,
        88
    ],
    "girlfriend" : {
        "name" : "alex",
        "gender" : "female",
        "age" : 30
    }
  }

 

 

 

  1)示例一:將score列表中的90改成80

 

 

 

 

 

 

  2)示例二:將tom的小於85的分數加上2分

 

 

 

 

 

 

  3)示例三:$只能存儲一個值

 

 

 

 

 

 

  4)示例四:將girlfriend的age改成22

 

 

 

 

 

  5)示例五:若tom的girlfriend的age小於25時,給其值加2

 

 

 

 

 

 

  6)示例六:Array中嵌套Object的操做

      咱們再創建以下數據演示:

{
      "_id" : ObjectId("5c407d5e456ef1f8f2b06402"),
      "name" : "tom",
      "chengji" : [
          {
              "title" : "python",
              "desc" : "very good",
              "score" : 90
          },
          {
              "title" : "linux",
              "desc" : "bad",
              "score" : 60
          },
       {
              "title" : "java",
              "desc" : "good",
              "score" : 82
       }
      ]
  }
db.userinfo.update({""chengji.score":{$lt:70}},{$inc:{"chengji.$.score":2}})

  {"chegnji.score":{$lt:70}}, 雖然chegnji是Array, 表示從內部的Object中找到score小於70的結果

  {$inc:{"chengji.$.score":2}}, chegnji中第$(小於70的第一個)個Object中score加2

 

 

 

 

 

 

 

10 , limit, skip, sort

  1)  limit 選取:  從documents 中取出多少個

  2) Skip跳過: 跳過多少個Documents

 

 

 

 

 

 

 

 

 

 

   3) sort 排序: 將結果按照關鍵字排序(1 爲升序, -1爲降序)

 

 

 

 

 

 

   4)  limit + skip  + sort   混合使用

  注意 : sort + skip +limit 是有執行優先級的, 他們的界別分別是, 優先Sort 其次Skip  最後limit

 

四,  pymongo

相似pymysql,pymongo是python中操做mongodb數據庫的模塊。

一、安裝

pip3 install pymongo

二、使用pymongo

  1)增長

import pymongo

mongoclient = pymongo.MongoClient(host="127.0.0.1", port=27017)
MongoDB = mongoclient["db1"] # db1是mongodb中的一個數據庫

res = MongoDB.userinfo.insert_one({"name":"heshun","age":18})
print(res)  # <pymongo.results.InsertOneResult object at 0x0000021019461F48>
print(type(res)) # <class 'pymongo.results.InsertOneResult'>
print(res.inserted_id)  # 5c444717e3a9e52b9c6c0491
print(type(res.inserted_id))  # <class 'bson.objectid.ObjectId'>

res = MongoDB.userinfo.insert_many([
    {"name":"張三","age":23},
    {"name":"李四","age":34}
])
print(res) # <pymongo.results.InsertManyResult object at 0x0000024A75760148>
print(type(res))  # <class 'pymongo.results.InsertManyResult'>
print(res.inserted_ids)  # [ObjectId('5c4447c3e3a9e523447f93e7'), ObjectId('5c4447c3e3a9e523447f93e8')]

總結: 

  -insert_one() 插入數據一條數據(documents), 返回值的insert_id 表示插入數據的"_id" 值, ObjectID類型;

  -insert_many([])插入多條數據(documents), 返回值的inserted_ids表示插入數據的"_id" 值組成的列表, 列表中的元素也是ObjectID 類型;

  2)查詢

import pymongo

  mongoclient = pymongo.MongoClient(host="127.0.0.1", port=27017)
  MongoDB = mongoclient["db1"]   # db1是mongodb中的一個數據庫
  
  res = MongoDB.userinfo.find_one()  # 查詢一條數據,返回字典
  print(res)
  # {'_id': ObjectId('5c3ee043949505956bbf9b33'), 'name': 'tom', 'age': 12.0}

  res = MongoDB.userinfo.find()  # 查詢全部數據,返回cursor對象,可迭代
  print(res)
  # <pymongo.cursor.Cursor object at 0x0000016CF07D7358>
  print(list(res))
  # [{'_id': ObjectId('5c3ee043949505956bbf9b33'), 'name': 'tom', 'age': 12.0}, 
  # {'_id': ObjectId('5c3eed9dcf0e440980eb4e45'), 'name': 'alex', 'age': 38}, 
  # {'_id': ObjectId('5c3eee24cf0e440838f79d3a'), 'name': 'wusir', 'age': 32}, 
  # {'_id': ObjectId('5c3eef71cf0e440ba4f5c40d'), 'name': '張三', 'age': 30}, 
  # {'_id': ObjectId('5c3eef71cf0e440ba4f5c40e'), 'name': '李四', 'age': 18}]

注意 : 同mongodb同樣, pymong也能夠find({條件},{排除字段})或者find_one({條件},{排除字段})

3)修改

  import pymongo

  mongoclient = pymongo.MongoClient(host="127.0.0.1", port=27017)
  MongoDB = mongoclient["db1"]   # db1是mongodb中的一個數據庫

  res = MongoDB.userinfo.update_one({"name":"tom"},{"$set":{"age":15}})

  print(res)
  # <pymongo.results.UpdateResult object at 0x000001A888325E08>
  print(dir(res))
  # [..., '__delattr__',..., 'raw_result', 'upserted_id']

  res = MongoDB.userinfo.update_many({"age":15},{"$set":{"age":22}})
  print(res.raw_result)  # 修改結果,包括影響行數,是否存在須要修改的數據等
  # {'n': 2, 'nModified': 2, 'ok': 1.0, 'updatedExisting': True}

總結: 除上例中的$set以外, $push, $pull 等方法均可以使用

  4)刪除

  import pymongo

  mongoclient = pymongo.MongoClient(host="127.0.0.1", port=27017)
  MongoDB = mongoclient["db1"]   # db1是mongodb中的一個數據庫

  res = MongoDB.userinfo.delete_one({"name":"wusir"})
  res = MongoDB.userinfo.delete_many({"age":22})

  5)sort、limit、skip

  import pymongo

  mongoclient = pymongo.MongoClient(host="127.0.0.1", port=27017)
  MongoDB = mongoclient["db1"]   # db1是mongodb中的一個數據庫

  res = MongoDB.userinfo.find().skip(2).limit(2)  # 跳過兩條,顯示兩條
  print(list(res))

  # pymongo.ASCENDING表示升序,pymongo.DESCENDING表示降序
  res = MongoDB.userinfo.find().sort("age", pymongo.ASCENDING)
  print(list(res))
  res = MongoDB.userinfo.find().sort("age", pymongo.DESCENDING)   print(list(res))

  6) 字符串類型與ObjectID類型的相互轉換

  咱們知道ObjectID不能被序列化, 而mongodb中的"_id" 是ObjectID 類型數據, 且常常須要將數據json序列化後進行傳輸,下面介紹字符串類型與ObjectID類型相互轉換。

  import pymongo
  from bson import ObjectId

  mongoclient = pymongo.MongoClient(host="127.0.0.1", port=27017)
  MongoDB = mongoclient["db1"]   # db1是mongodb中的一個數據庫

  res = MongoDB.userinfo.find_one()
  s = res.get("_id")
  print(s)  # 5c3eef71cf0e440ba4f5c40d
  print(type(s))  # <class 'bson.objectid.ObjectId'>
  print(str(s))  # 5c3eef71cf0e440ba4f5c40d
  print(type(str(s)))  # <class 'str'>

  s = ObjectId("5c3eef71cf0e440ba4f5c40d")      # 強轉成ObjectID類型
  res = MongoDB.userinfo.find_one({"_id":s})
  print(res)
  # {'_id': ObjectId('5c3eef71cf0e440ba4f5c40d'), 'name': '張三', 'age': 30}
相關文章
相關標籤/搜索