NoSQL-MongoDB with python

前言:

MongoDB,文檔存儲型數據庫(document store)。NoSQL數據庫中,它獨占鰲頭,碾壓其他的NoSQL數據庫。

使用C++開發的,性能僅次C。與redis一樣,開源、高擴展、高可用。

基于分布式文件存儲。分布式:文件分開存的(由Google提出的mapreduce,是目前分布式的鼻祖)。就像蘋果的iCloud,照片、文件分開存儲的。

紐約時報用的數據庫就是它(from wiki),360部分業務的數據庫也是它。而且據說偉大的wiki,也是從曾經的MySQL遷移到了MongoDB。

MongoDB的適用場景可以看下這篇文章:https://yq.aliyun.com/articles/64352

但要注意,MongoDB在使用過程中會消耗大量磁盤空間和內存。而且,MongoDB它非事務機制,無法保證事件的原子性。

MongoDB不適合的場景:

(1).需高度事務性的系統。當原子性操作失敗時,傳統的關系型數據庫支持回滾操作,以保證數據在操作過程中的正確性。而目前,MongoDB暫不支持此事務。例如銀行或會計系統。

(2).傳統的商業智能應用。針對特定問題的BI數據庫需要高度優化的查詢方式。

(3).使用SQL方便時(關聯查詢)。MongoDB的查詢方式是JSON類型的查詢方式,雖然查詢也比較靈活,但如果使用SQL進行統計會比較方便時,這種情況就不適合使用MongoDB。

?

MongoDB描述、層次結構:

(一).描述

MongoDB是文檔數據庫,以文檔為單位。Bson文檔(Json的二進制)

與JS相關,內部引擎用了JS解釋器。

把一個文檔存儲為Bson結構,在查詢時,轉換位Json對象,并可以通過JS語法來操作。

(二).層次結構

庫 -> 集合 -> 文檔

?

MongoDB PK?傳統型數據庫:

傳統型數據庫:結構化數據,定好表結構后,每一行內容必須符合表結構,以至于每一行看起來都長得差不多。

MongoDB:以文檔為單位,沒有表結構。表中的每篇文檔都可以有自己獨特的屬性和結構。

MongoDB最大的特點就是反范式化,管你幾張表,都可以一個文檔解決。每個文檔相當于一棵樹,可以無限伸枝。文檔與文檔之間相互獨立,沒有固定的結構。

(一).文檔的表現形式:一個Json對象,一個文檔

# 一個文檔
{id: 3name: "lisi"age: 10
}# 另一個文檔
{id: 4name: "wangwu"age: 20area: "nb"hobby: ["swimming", "football"]
}
View Code

(二).思考這么一個問題:

以此https://movie.douban.com/subject/26861685/?from=showing為例,設計一個影評數據庫。

傳統數據庫:影片信息一張表,影評一張表,回復評論一張表,打分一張表。查詢起來相當費勁,關聯相當復雜。

MongoDB:上述內容全部丟進一個文檔中解決:

{file_name: "紅海行動"long_time: 120comment: [{comment1: "影評1"reply1: "好評"}]
}
View Code

?

一、install MongoDB for win7 32bit(萬事從安裝開始)

悲催的win7 32位系統,安裝MongoDB可是受盡折磨,不是執行命令后沒反應、就是因為32/64位的問題……

好在運氣不錯,找到了這篇文章:https://www.cnblogs.com/chenyucong/p/6217017.html 此博主提供了一個版本,本人跟著操作也行了。

直接照著那篇搞就可以:(配置命令去復制就可以了,自己敲會出錯,而且配置一次就完事了,又不是非要掌握的)

第一步操作成功:MongoDB的默認端口為27017

第二步配置:(注意環境變量的路徑大小寫,第一次沒成功,后來直接在地址欄上復制了路徑,成了!所以猜測,可能是因為路徑大小寫問題造成)

有時候電腦會抽風,即使配置好了環境變量,在C盤盤符下打這串命令會提示不是內部命令。那么直接cd進入mongodb/bin目錄,再執行這條命令,就行了。

可在系統服務中看到它了:

相對現在的新版本,這個算是很老的版本了,不過學習用應該是夠了。

MongoDB使用內存映射文件,32位系統上,數據庫容量最大上限為2G,關于這個內存映射文件,不了解也沒關系,影響不大。找來了偉大的wiki:https://zh.wikipedia.org/wiki/%E5%86%85%E5%AD%98%E6%98%A0%E5%B0%84%E6%96%87%E4%BB%B6

第三步:搞一個可視化管理工具

本來想用Robomongo(因為它界面很好看),但沒找到適用于win7 32位系統的[/噴血]。如有大大找到的話,懇請提供。

現在在用MongoVUE,專門用于windows系統的。填寫連接卡的時候,最后下面三個不填也可以連上。Name隨便寫,可以寫你喜歡的人的名字;Server:具體情況具體填,可以填一個遠程主機的IP;Database(s)這項不填,就會獲得所有數據庫。

?

二、install MongoDB on Ubuntu server

(一).簡易安裝

ubuntu server的apt秒天秒地,更新好apt之后直接鍵入命令:apt install mongodb

安裝完后,想要查看版本可用命令:mongo -version

用apt命令直接安裝不會是最新版本,最好去官網https://www.mongodb.com/download-center/community下載進行源碼安裝。

(二).源碼安裝

(三).在ubuntu server中的更新MongoDB

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6

echo "deb http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list

sudo apt-get updatesudo apt-get install -y mongodb-orgsystemctl unmask mongodbservice mongodb start
View Code

這些操作后,MongoDB依然不會是最新版本,想要最新版去官網下載并進行源碼安裝。

?

三、MongoDB原生態命令

(一).插入文檔

命令格式:db.collection_name.insert()小括號里寫json

例如:

db.biancheng.insert({name:"yekai",age:35,sex:"man",info:{like:"drink",wuqi:"feidao"}})
View Code

(二).更新文檔

(1).只更新指定的數據

db.collection_name.update({查詢條件json},{$set:{新數據json1,新數據json2,...}})

例如:

db.biancheng.update({name:"yekai"},{$set:{name:"yekai1",age:40}})
View Code

?

四、python3操作MongoDB

(一).連接localhost server,創建一個新數據庫

注意:MongoDB的默認端口號是27017,跟其他數據庫一樣,創建連接時要寫上。

from pymongo import MongoClientconn = MongoClient("localhost", 27017)# 也可以寫成
# conn = MongoClient("mongodb://localhost:27017")

db = conn.testdb  # 創建數據庫

conn.close()
View Code

MongoDB不需要提前創建好數據庫,可以直接"連接對象.數據庫名稱"。如果沒有這個數據庫,則會自動創建。如果有這個數據庫了,就會連接上。

但是,如果該數據庫中沒有數據,則不會顯示在管理工具里面。

(二).增。

(1).插入單個文檔

from pymongo import MongoClientconn = MongoClient("localhost", 27017)
db = conn.testdb# db = MongoClient("localhost", 27017).testdb
# 這樣寫的話,后面數據庫連接就沒法關閉了。所以別偷懶,還是要分開寫。

db.col.insert({"name": "quanquan616", "province": "浙江", "age": 30})  # col是表名

conn.close()
View Code

(2).插入多個文檔

from pymongo import MongoClientconn = MongoClient("localhost", 27017)
db = conn.testdbdb.col.insert([{"name": '張三', 'province': '浙江', 'age': 24},{"name": 'yuanyuan', 'province': '山東', 'age': 24},{"name": 'jt', 'province': '陜西', 'age': 30}
])conn.close()
View Code

總結:插入多個文檔,insert()的括號中,需要用[]把元素包裹起來。insert([{},{},{}])

(三).刪。特別注意:remove()括號中不加條件,就會把表中的記錄全刪了!切記注意!不然得賠80個億,跳海喂鯊魚去吧……

from pymongo import MongoClientconn = MongoClient("localhost", 27017)
db = conn.testdbdb.col.remove({"name": "張三"})conn.close()
View Code

(四).改。update({條件},{更新的數據})

把條件和更新的數據放進去update()的括號里就可以了。更新語句,注意格式別寫錯了,應該是{"$set":{"key":value}}

from pymongo import MongoClientconn = MongoClient("localhost", 27017)
db = conn.testdbdb.col.update({"name": "quanquan616"}, {"$set": {"age": 29}})conn.close()
View Code

(五).查。

(1).使用find_one()查詢并返回第一個匹配到的文檔

from pymongo import MongoClientconn = MongoClient("localhost", 27017)
db = conn.testdbdb.col.find_one()conn.close()
View Code

可以把"db.col.find_one()"放在print()中,這樣就可以看到打印出來的查詢結果了。print()之后的結果:{'_id': ObjectId('5a924d0f36af002d307cc30b'), 'name': 'quanquan616', 'province': '浙江', 'age': 30}

這個'_id':ObjectId('xxxxxxxxx')是自動生成的唯一值

db.col.find_one({"name":"abc"}) 沒有找到文檔則返回None

(2).查詢所有記錄。可以使用find()函數,執行后返回的是一個結果集對象,需要用for循環遍歷出來。

from pymongo import MongoClientconn = MongoClient("localhost", 27017)
db = conn.testdb# print(db.col.find())  # <pymongo.cursor.Cursor object at 0x01D96210>for item in db.col.find():print(item)conn.close()"""
# 遠行結果:
{'_id': ObjectId('5a924d0f36af002d307cc30b'), 'name': 'quanquan616', 'province': '浙江', 'age': 30}
{'_id': ObjectId('5a92520f36af001ca0fb665c'), 'name': '張三', 'province': '浙江', 'age': 24}
{'_id': ObjectId('5a92520f36af001ca0fb665d'), 'name': 'yuanyuan', 'province': '山東', 'age': 24}
{'_id': ObjectId('5a92520f36af001ca0fb665e'), 'name': 'jt', 'province': '陜西', 'age': 30}
"""
View Code

(3).條件查詢

只需要將條件當作參數放進find()的括號中即可:

from pymongo import MongoClientconn = MongoClient("localhost", 27017)
db = conn.testdbfor item in db.col.find({"name": "quanquan616"}):print(item)conn.close()
View Code

例1:查詢所有小于某個值的記錄

from pymongo import MongoClientconn = MongoClient("localhost", 27017)
db = conn.testdbfor item in db.col.find({"age": {"$lt": 25}}):print(item)conn.close()"""
運行結果:
{'_id': ObjectId('5a92520f36af001ca0fb665c'), 'name': '張三', 'province': '浙江', 'age': 24}
{'_id': ObjectId('5a92520f36af001ca0fb665d'), 'name': 'yuanyuan', 'province': '山東', 'age': 24}
"""
View Code

補充:大于的話,就把{"age":{"$lt":25}}中的lt換成gt

(4).統計記錄

from pymongo import MongoClientconn = MongoClient("localhost", 27017)
db = conn.testdbdb.col.find({"age": {"$eq": 30}}).count()  # 返回int,但不會直接顯示結果,需要賦值變量或者打印
# print(db.col.find({"age": {"$eq": 30}}).count())  # 2

conn.close()
View Code

(5).根據_id查詢記錄

需要引入一個庫,這個庫python3自帶了。from bson.objectid import ObjectId

from pymongo import MongoClient
from bson.objectid import ObjectIdconn = MongoClient("localhost", 27017)
db = conn.testdb# ObjectId是唯一的,所以用find_one()就可以了
db.col.find_one({'_id': {ObjectId('5a924d0f36af002d307cc30b')}})
# print(db.col.find_one({'_id': ObjectId('5a924d0f36af002d307cc30b')}))
# {'_id': ObjectId('5a924d0f36af002d307cc30b'), 'name': 'quanquan616', 'province': '浙江', 'age': 30}

conn.close()
View Code

(6).排序。MongoDB默認升序排序。

sort()小括號中放入指定的key就可以了:

from pymongo import MongoClientconn = MongoClient("localhost", 27017)
db = conn.testdbfor item in db.col.find().sort("age"):print(item)conn.close()"""
運行結果:
{'_id': ObjectId('5a92520f36af001ca0fb665c'), 'name': '張三', 'province': '浙江', 'age': 24}
{'_id': ObjectId('5a92520f36af001ca0fb665d'), 'name': 'yuanyuan', 'province': '山東', 'age': 24}
{'_id': ObjectId('5a924d0f36af002d307cc30b'), 'name': 'quanquan616', 'province': '浙江', 'age': 30}
{'_id': ObjectId('5a92520f36af001ca0fb665e'), 'name': 'jt', 'province': '陜西', 'age': 30}
"""
View Code

另外,可以加入參數去設定排序方式。

比如倒序,例1:(需要引入pymongo)

import pymongo
from pymongo import MongoClientconn = MongoClient("localhost", 27017)
db = conn.testdbfor item in db.col.find().sort("age", pymongo.DESCENDING):  # descending降序print(item)conn.close()
View Code

(六).補充內容

(1).刪除一張表:db.drop_collection("table_name") 表和其中的數據同時刪除

(2).查看一個數據庫中所有的表:db.collection_names()

?

轉載于:https://www.cnblogs.com/quanquan616/p/8463567.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/252328.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252328.shtml
英文地址,請注明出處:http://en.pswp.cn/news/252328.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

RHCS

云計算與大數據 黑洞 RHCS(概念篇) 一、 什么是RHCS RHCS是Red Hat Cluster Suite的縮寫&#xff0c;也就是紅帽子集群套件&#xff0c;RHCS是一個能夠提供高可用性、高可靠性、負載均衡、存儲共享且經濟廉價的集群工具集合&#xff0c;它將集群系統中三大集群架構融合一體&…

深度圖壓縮之-高低8位拆分保存

使用kinect相機保存數據&#xff0c;為了減少保存的數據集量&#xff0c;對圖像進行壓縮。將彩色圖像直接壓縮成.mp4格式&#xff0c;此時圖像上的一些高頻信息會被損失掉。 為了能夠讓深度圖有比較高的保真度&#xff0c;減少深度圖上高頻信息的損失&#xff0c;我們將16位的…

linux 一個超簡單的makefile

2019獨角獸企業重金招聘Python工程師標準>>> makefile 自動化變量&#xff1a; $ : 規則的目標文件名 例如&#xff1a;main:main.o test.o g -Wall -g main.o test.o -o main 可以寫成&#xff1a; main:main.o test.o g -Wall -g main.o test.o -o $ $< : …

poj2480(利用歐拉函數的積性求解)

題目鏈接: http://poj.org/problem?id2480 題意&#xff1a;∑gcd(i, N) 1<i <N&#xff0c;就這個公式&#xff0c;給你一個n&#xff0c;讓你求sumgcd(1,n)gcd(2,n)gcd(3,n)…………gcd(n-1,n)gcd(n,n),&#xff08;1<n<2^31&#xff09;是多少&#xff1f; 放…

跨域問題

一、為什么會有跨域問題&#xff1f; 是因為瀏覽器的同源策略是對ajax請求進行阻攔了&#xff0c;但是不是所有的請求都給做跨域&#xff0c;像是一般的href屬性&#xff0c;a標簽什么的都不攔截。 二、解決跨域問題的兩種方式 JSONPCORS 三、JSONP 先簡單來說一下JSONP&#x…

PAT A1052

這個需要注意的是相關的string轉整數或者double的函數&#xff1b;詳見這個鏈接blog #include <iostream> #include <string> using namespace std; bool isPrime(int n) {if (n 0 || n 1) return false;for (int i 2; i * i < n; i)if (n % i 0) return fa…

php審計學習:xdcms2.0.8注入

注入點Fields: 注冊頁面會引用如下方法: $fields 變量是從 $fields$_POST[fields]; 這里獲取&#xff0c; 在代碼里沒有過濾。 打印 fields 數據查看: 從代碼上看 $field_sql.",{$k}{$f_value}"; 最終會變成: ,truename111111,email12345 因為 $field_sql 最終會引入…

windows下安裝python和Python-opencv

背景&#xff1a;目前基于python的圖像處理和機器視覺的研究還挺多&#xff0c;最近不是在研究目標檢測和目標跟蹤的算法&#xff0c;由于檢測和跟蹤的環境比較簡單所以從不帶學習的跟蹤方法&#xff0c;在搜索資料時搜到這個網站&#xff0c;是對opencv中的目標跟蹤算法的一個…

捋一捋js面向對象的繼承問題

說到面向對象這個破玩意&#xff0c;曾經一度我都處于很懵逼的狀態&#xff0c;那么面向對象究竟是什么呢&#xff1f;其實說白了&#xff0c;所謂面向對象&#xff0c;就是基于類這個概念&#xff0c;來實現封裝、繼承和多態的一種編程思想罷了。今天我們就來說一下這其中繼承…

java8簡單入門

1、介紹 本片文章會從一下幾個知識點進行介紹&#xff1a; 函數式接口 FunctionalInterfaceLambda 表達式函數引用 Function ReferenceStream看了幾篇關于 java8 入門的例子&#xff0c;其中引入了許多令人期待已久的特性&#xff08;雖然我沒有過這樣的體會&#xff09;&#…

玩轉帶外觸發的單目相機之一

背景&#xff1a;去年開始研究vins,但是只是用了普通的相機&#xff0c;然后將IMU和相機粘在一起&#xff0c;然后就是聯合標定相機和IMU。VINS使用的相機是帶有外觸發的&#xff0c;還進行了相機和IMU的硬件時間同步。當時我特別想買個帶外觸發的相機&#xff0c;一直沒找到資…

基于django的視頻點播網站開發-step11-后臺用戶管理功能...

用戶管理功能&#xff0c;包含用戶添加、列表展示、編輯、刪除四大功能。下面我們一一揭曉。 用戶添加 我們先實現用戶添加功能&#xff0c;我們現在urls.py下添加相關的路由 path(user_add/, views.UserAddView.as_view(), nameuser_add), path(user_list/, views.UserListVie…

BZOJ 1070 拆點 費用流

1070: [SCOI2007]修車 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 5860 Solved: 2487[Submit][Status][Discuss]Description 同一時刻有N位車主帶著他們的愛車來到了汽車維修中心。維修中心共有M位技術人員&#xff0c;不同的技術人員對不同 的車進行維修所用的時間是不…

分布式之數據庫和緩存雙寫一致性方案解析

先做一個說明&#xff0c;從理論上來說&#xff0c;給緩存設置過期時間&#xff0c;是保證最終一致性的解決方案。這種方案下&#xff0c;我們可以對存入緩存的數據設置過期時間&#xff0c;所有的寫操作以數據庫為準&#xff0c;對緩存操作只是盡最大努力即可。也就是說如果數…

使用python從csv文件中讀入兩列擬合直線

背景&#xff1a;要判斷跟蹤算法在控制目標物走直線的情況下跟蹤的軌跡是否為直線&#xff0c;我保存下來跟蹤算法跟蹤到的目標的中心點在圖像上的像素位置&#xff0c;然后擬合出穿過這些點的直線&#xff0c;然后計算這些點距離直線的平均距離來判斷跟蹤的精度。&#xff08;…

window document

1 打開一個新窗口 var newDocwindow.open("text/html","replace");var txt"<html><body>Learning about the DOM is FUN!</body></html>";newDoc.document.write(txt);newDoc.close(); //該方法將關閉 open() 方法打開…

‘(‘:illegal token on right side of ‘::‘

背景&#xff1a;想整理升級一下代碼&#xff0c;添加了兩個類&#xff0c;再一編譯代碼&#xff0c;出現了好多這樣的錯誤提示“(:illegal token on right side of ::”&#xff0c;我很納悶這是啥問題&#xff0c;我就使用“注釋法”來定位出錯的位置&#xff0c;我發現把所有…

mysql-數據庫操作

doc界面操作mysql:<br/> 以phpstudy為例 登錄數據庫&#xff1a;進入phpstudy/mysql/bin下&#xff0c;mysql -u用戶名 -p密碼 選擇數據庫&#xff1a;use 數據庫名; 設置編碼格式&#xff1a;set names gbk; 查看表結構或字段信息&#xff1a;desc 表名; 建立數據庫&…

虹軟免費人臉識別SDK注冊指南

2019獨角獸企業重金招聘Python工程師標準>>> 成為開發者三步完成賬號的基本注冊與認證&#xff1a; STEP1:點擊注冊虹軟AI開放平臺右上角注冊選項&#xff0c;完成注冊流程。 STEP2:首次使用&#xff0c;登錄后進入開發者中心&#xff0c;點擊賬號管理完成企業或者個…

Mybatis使用statementType=STATEMENT實現動態傳入表名或字段名

mybatis中使用statementType"STATEMENT"實現動態傳入字段名時一直報語句錯誤&#xff0c;但實際上語句并沒有毛病&#xff0c;爬了一天坑才找到問題&#xff0c;記錄一下。 整條語句中里所有傳入的值都要使用${xxx},不能使用#{xxx}。 <select id"listMap&quo…