1. 程式人生 > >Mongodb簡介及基本操作

Mongodb簡介及基本操作

一、簡介

MongoDB是一款強大、靈活、且易於擴充套件的通用型資料庫

MongoDB 是由C++語言編寫的,是一個基於分散式檔案儲存的開源資料庫系統。

在高負載的情況下,新增更多的節點,可以保證伺服器效能。

MongoDB 旨在為WEB應用提供可擴充套件的高效能資料儲存解決方案。

MongoDB 將資料儲存為一個文件,資料結構由鍵值(key=>value)對組成。MongoDB 文件類似於 JSON 物件。欄位值可以包含其他文件,陣列及文件陣列。

MongoDB的特點:

1、易用性

MongoDB是由C++編寫的,是一個基於分散式檔案儲存的開源資料庫系統,它不是關係型資料庫。在高負載的情況下,新增更多的節點,可以保證伺服器的效能。

MongoDB是一個面向文件(document-oriented)的資料庫,而不是關係型資料庫。
不採用關係型主要是為了獲得更好得擴充套件性。當然還有一些其他好處,與關係資料庫相比,面向文件的資料庫不再有“行“(row)
的概念取而代之的是更為靈活的“文件”(document)模型。通過在文件中嵌入文件和陣列,面向文件的方法能夠僅使用一條記錄
來表現複雜的層級關係,這與現代的面嚮物件語言的開發者對資料的看法一致。
 
 
另外,不再有預定義模式(predefined schema):文件的鍵(key)和值(value)不再是固定的型別和大小
。由於沒有固定的模式,根據需要新增或刪除欄位變得更容易了。通常由於開發者能夠進行快速迭代,所以開發程序得以加快。
而且,實驗更容易進行。開發者能嘗試大量的資料模型,從中選一個最好的。

 

2、易擴充套件性

應用程式資料集的大小正在以不可思議的速度增長。隨著可用頻寬的增長和儲存器價格的下降,即使是一個小規模的應用程式,需要儲存的資料量也可能大的驚人,甚至超出
了很多資料庫的處理能力。過去非常罕見的T級資料,現在已經是司空見慣了。
由於需要儲存的資料量不斷增長,開發者面臨一個問題:應該如何擴充套件資料庫,分為縱向擴充套件和橫向擴充套件,縱向擴充套件是最省力的做法,但缺點是大型機一般都非常貴,而且
當資料量達到機器的物理極限時,花再多的錢也買不到更強的機器了,此時選擇橫向擴充套件更為合適,但橫向擴充套件帶來的另外一個問題就是需要管理的機器太多。
MongoDB的設計採用橫向擴充套件。面向文件的資料模型使它能很容易地在多臺伺服器之間進行資料分割。MongoDB能夠自動處理跨叢集的資料和負載,自動重新分配文件,
以及將使用者的請求路由到正確的機器上。這樣,開發者能夠集中精力編寫應用程式,而不需要考慮如何擴充套件的問題。
如果一個叢集需要更大的容量,只需要向叢集新增新伺服器,MongoDB就會自動將現有的資料向新伺服器傳送

3、豐富的功能

MongoDB作為一款通用型資料庫,除了能夠建立、讀取、更新和刪除資料之外,還提供了一系列不斷擴充套件的獨特功能
#1、索引
支援通用二級索引,允許多種快速查詢,且提供唯一索引、複合索引、地理空間索引、全文索引

#2、聚合
支援聚合管道,使用者能通過簡單的片段建立複雜的集合,並通過資料庫自動優化

#3、特殊的集合型別
支援存在時間有限的集合,適用於那些將在某個時刻過期的資料,如會話session。類似地,MongoDB也支援固定大小的集合
,用於儲存近期資料,如日誌 #4、檔案儲存 支援一種非常易用的協議,用於儲存大檔案和檔案元資料。MongoDB並不具備一些在關係型資料庫中很普遍的功能,
如連結join和複雜的多行事務。省略 這些的功能是處於架構上的考慮,或者說為了得到更好的擴充套件性,因為在分散式系統中這兩個功能難以高效地實現

 

4、卓越的效能

MongoDB的一個主要目標是提供卓越的效能,這很大程度上決定了MongoDB的設計。MongoDB把儘可能多的記憶體用作快取cache,
檢視為每次查詢自動選擇正確的索引。 總之各方面的設計都旨在保持它的高效能 雖然MongoDB非常強大並試圖保留關係型資料庫的很多特性,但它並不追求具備關係型資料庫的所有功能。
只要有可能,資料庫伺服器就會將處理邏輯交給客戶端
。這種精簡方式的設計是MongoDB能夠實現如此高效能的原因之一

 

二、MongoDB基礎知識

1、文件是MongoDB的核心概念。文件就是鍵值對的一個有序集{'msg':'hello','foo':3}。類似於python中的有序字典。

需要注意的是:
#1、文件中的鍵/值對是有序的。
#2、文件中的值不僅可以是在雙引號裡面的字串,還可以是其他幾種資料型別(甚至可以是整個嵌入的文件)。
#3、MongoDB區分型別和大小寫。
#4、MongoDB的文件不能有重複的鍵。
#5、文件中的值可以是多種不同的資料型別,也可以是一個完整的內嵌文件。文件的鍵是字串。除了少數例外情況,鍵可以使用任意UTF-8字元。

文件鍵命名規範:
#1、鍵不能含有\0 (空字元)。這個字元用來表示鍵的結尾。
#2、.和$有特別的意義,只有在特定環境下才能使用。
#3、以下劃線"_"開頭的鍵是保留的(不是嚴格要求的)。

2、集合就是一組文件。如果將MongoDB中的一個文件比喻為關係型資料的一行,那麼一個集合就是相當於一張表

#1、集合存在於資料庫中,通常情況下為了方便管理,不同格式和型別的資料應該插入到不同的集合,但其實集合沒有固定的結構,
這意味著我們完全可以把不同格式和型別的資料統統插入一個集合中。 #2、組織子集合的方式就是使用“.”,分隔不同名稱空間的子集合。 比如一個具有部落格功能的應用可能包含兩個集合,分別是blog.posts和blog.authors,這是為了使組織結構更清晰,
這裡的blog集合(這個集合甚至不需要存在)跟它的兩個子集合沒有任何關係。 在MongoDB中,使用子集合來組織資料非常高效,值得推薦 #3、當第一個文件插入時,集合就會被建立。合法的集合名: 集合名不能是空字串""。 集合名不能含有\0字元(空字元),這個字元表示集合名的結尾。 集合名不能以"system."開頭,這是為系統集合保留的字首。 使用者建立的集合名字不能含有保留字元。有些驅動程式的確支援在集合名裡面包含,這是因為某些系統生成的集合中包含該字元。
除非你要訪問這種系統建立的集合,否則千萬不要在名字裡出現$。

3、資料庫:在MongoDB中,多個文件組成集合,多個集合可以組成資料庫

資料庫也通過名字來標識。資料庫名可以是滿足以下條件的任意UTF-8字串:
#1、不能是空字串("")。
#2、不得含有' '(空格)、.、$、/、\和\0 (空字元)。
#3、應全部小寫。
#4、最多64位元組。

有一些資料庫名是保留的,可以直接訪問這些有特殊作用的資料庫。
#1、admin: 從身份認證的角度講,這是“root”資料庫,如果將一個使用者新增到admin資料庫,這個使用者將自動獲得所有資料庫的許可權。再者,一些特定的伺服器端命令也只能從admin資料庫執行,如列出所有資料庫或關閉伺服器
#2、local: 這個資料庫永遠都不可以複製,且一臺伺服器上的所有本地集合都可以儲存在這個資料庫中
#3、config: MongoDB用於分片設定時,分片資訊會儲存在config資料庫

4、強調:把資料庫名新增到集合名前,得到集合的完全限定名,即名稱空間

例如:
如果要使用cms資料庫中的blog.posts集合,這個集合的名稱空間就是
cms.blog.posts。名稱空間的長度不得超過121個位元組,且在實際使用中應該小於100個位元組

 

Mongodb對資料庫的增刪改查

增:use db1 :#有則切換,無則新 增
查:    
    - show dbs #檢視所有資料庫
    - db #檢視當前庫
刪:db.dropDatabase()
    
#不會就用help

 

對集合(表)的增刪改查

增:
    - db.user.info  #user.info表
    - db.user #user表
    - db.user.auth  ##user.auth表


  當第一個文件插入時,集合就會被建立
  > use database1
  switched to db database1
  > db.table1.insert({'a':1})
  WriteResult({ "nInserted" : 1 })
  > db.table2.insert({'b':2})
  WriteResult({ "nInserted" : 1 })
查:
    - show collections
    - show tables  #這兩個是一樣的
    #只要是空不顯示
刪:
    - db.user.info.help()  #檢視幫助
    - db.user.info.drop()

 

對資料的增刪改查

 1 import pymongo
 2 
 3 mongo = pymongo.MongoClient("127.0.0.1",27017)
 4 MONGODB = mongo["SS2DAY04"]
 5 
 6 #查:
 7 # result = list(MONGODB.users.find({}))
 8 # for item in result:
 9 #     print(item)
10 # print(result)
11 
12 # result_one = MONGODB.users.find_one({})
13 # print(result_one,type(result_one))
14 # print(result_one.get("_id"),type(result_one.get("_id")))
15 
16 # 增:
17 # res = MONGODB.student.insert_one({"name":"yd","nickname":"wl"})
18 # print(res.inserted_id,type(res.inserted_id))
19 # res = MONGODB.student.insert_many([{"name":"yd","nickname":"wl"},{"name":"wpq","nickname":"cb"},{"name":"lj","nickname":"dsb"}])
20 # print(res.inserted_ids)
21 
22 # 刪:
23 # MONGODB.student.remove({})
24 # MONGODB.student.delete_one({"name":"yd"})
25 # MONGODB.student.delete_many({"name":"yd"})
26 
27 # 改:
28 # MONGODB.student.update({"name":"yd"})
29 # MONGODB.student.update_one({"name":"wpq"},{"$set":{"nickname":"peppa pig"}})
30 # MONGODB.student.update_many({},{"$set":{"age":84}})
31 
32 
33 # 刪:
34 # MONGODB.student.delete_many({})
35 # MONGODB.student.drop()
36 
37 # 分頁:
38 # res = MONGODB.users.find({}).sort("age",pymongo.ASCENDING).limit(2).skip(0)
39 # for i in res:
40 #     print(i)

 

 

 

pymongo連線mongodb

 1 from pymongo import MongoClient
 2 
 3 #1、連結
 4 client=MongoClient('mongodb://root:[email protected]:27017/')
 5 # client = MongoClient('localhost', 27017)
 6 
 7 #2、use 資料庫
 8 db=client['db2'] #等同於:client.db1
 9 
10 #3、檢視庫下所有的集合
11 print(db.collection_names(include_system_collections=False))
12 
13 #4、建立集合
14 table_user=db['userinfo'] #等同於:db.user
15 
16 #5、插入文件
17 import datetime
18 user0={
19     "_id":1,
20     "name":"egon",
21     "birth":datetime.datetime.now(),
22     "age":10,
23     'hobbies':['music','read','dancing'],
24     'addr':{
25         'country':'China',
26         'city':'BJ'
27     }
28 }
29 
30 user1={
31     "_id":2,
32     "name":"alex",
33     "birth":datetime.datetime.now(),
34     "age":10,
35     'hobbies':['music','read','dancing'],
36     'addr':{
37         'country':'China',
38         'city':'weifang'
39     }
40 }
41 # res=table_user.insert_many([user0,user1]).inserted_ids
42 # print(res)
43 # print(table_user.count())
44 
45 #6、查詢
46 
47 # from pprint import pprint#格式化細
48 # pprint(table_user.find_one())
49 # for item in table_user.find():
50 #     pprint(item)
51 
52 # print(table_user.find_one({"_id":{"$gte":1},"name":'egon'}))
53 
54 #7、更新
55 table_user.update({'_id':1},{'name':'EGON'})
56 
57 #8、傳入新的文件替換舊的文件
58 table_user.save(
59     {
60         "_id":2,
61         "name":'egon_xxx'
62     }
63 )