Python學習日記6|在python中操作MongoDB數(shù)據(jù)庫

今天是4.21號。

最近特別煩,不知是不是因為沒找到實習的緣故,加上論文還沒有消息回復。感覺馬上不是面臨找不到工作的壓力,就是可能畢不了業(yè)。看到周圍人都開始實習,自己在這里瞎折騰說不擔心是安慰自己裝出來的。

甚至開始懷疑自己到底能夠做什么,到底準備做什么。問問自己,一點底都沒有。技術(shù)技術(shù)做不了,產(chǎn)品產(chǎn)品做不了,想起去年這個時候也是在胡亂找實習,結(jié)果一事無成。

算了吧,最低要求,先把畢業(yè)要求達到再說,否則其他一切都是免談。可是那些雜志社敢不敢給我來個好消息,昂。


首先了解一下mongoDB中存儲數(shù)據(jù)時的一些概念


mongodb一些基本概念.png
mongodb中的數(shù)據(jù)類型.png

對于數(shù)據(jù)庫的操作無外乎對表(集合)的操作和對數(shù)據(jù)(文檔)的操作。在python中進行下面的所有操作前,先必須有這幾條語句:

import pymongo

#與mongodb服務器建立連接
connection = pymongo.MongoClient('localhost', 27017)

student=connection['student'] #新建一個名為student的數(shù)據(jù)庫
或直接連接已有數(shù)據(jù)庫,類似db = connection['tongcheng'],再直接使用數(shù)據(jù)庫的表content,infor=db['content']

connection.drop_database('student') #將名為student的數(shù)據(jù)庫刪除掉

#下面以student庫以及庫中的users集合(表)進行講解:

一. 建表、刪除表;
# 建立名為users的集合(表),同建立數(shù)據(jù)庫形式一樣
users=student['users']
# 刪除users集合
student.users.drop()

二. 插入、刪除、更新記錄(文檔);

(1)對建好的集合中插入數(shù)據(jù),用insert(),insert_one()函數(shù)
    users.insert_one({'nickname':'namei'}) #一般要在表前加上數(shù)據(jù)庫的名稱即
    student.users.insert_one({'nickname':'namei'})

(2)刪除集合中的文檔,用remove()函數(shù),刪除后的文檔無法恢復
    student.users.remove() 表示刪除集合里的所有記錄
    student.users.remove({'yy':5}) #表刪除yy=5的記錄
    
    id = student.users.find_one({'name':'user2'})['_id']
    student.users.remove(id) # 查找到name=user2的記錄,并根據(jù)記錄的 id 刪除該記錄

(3)更新記錄,用update()函數(shù)
    update(criteria, objNew, upsert, mult)
    criteria: 需要被更新的條件表達式
    objNew: 更新表達式
    upsert: 如目標記錄不存在,是否插入新文檔。
    multi: 是否更新多個文檔。

    student.users.update({'gid':last_gid, 'time':l_date}, {'$set':{'gid':last_gid}, '$set':{'time':l_date}, '$addToSet':{'categories':category_data}}, upsert=True)
    #上式表示添加'categories'字段到gid=last_gid,time=l_date的這條記錄中。

三. 數(shù)據(jù)的查詢,這也是數(shù)據(jù)庫操作的重點

    基本上是用find()函數(shù)進行查詢,其中大于、大于等于、小于、小于等于這些關系運算符經(jīng)常要用到,
分別用'$gt','$gte','$lt','$lte'表示。

(1)查詢顯示符合條件的記錄
    # 查詢 age 小于 15 的
    for u in student.users.find({"age":{"$lt":15}}): print u
    # 查詢 name 等于 user8 的
    for u in student.users.find({"name":"user8"}): print u

    # 獲取查詢的一個記錄 (注意用find_one()而不是find())
    u2 = student.users.find_one({"name":"user9"}) # 查不到時返回 None
    print u2

(2)查詢符合條件的特定鍵 (fields)
    # select name, age from users 
    for u in student.users.find(fields = ['name', 'age']): print u

    # select name, age from users where age = 21
    for u in student.users.find({"age":21}, ["name", "age"]): print u
 *這里要注意,["name", "age"]中可以是一個,也可以是多個;同時["name", "age"]是放在條件{}外的。

(3)多條件查詢(Conditional Operators)    # like 的可使用正則表達式查詢

    # select * from users where name = 'user3' and age > 12 and age < 15
    for u in db.users.find({'age': {'$gt': 12, '$lt': 15}, 'name': 'user3'}): print u
    # select * from users where name = 'user1' and age = 21
    for u in db.users.find({"age":21, "name":"user1"}): print u

*記住,使用find()函數(shù)時,對應的條件都是以字典形式表示{'age':{'$gt':12},'xx':'xx'},
有多個條件時,都放在一個{}內(nèi)



(4)IN
    # select * from users where age in (23, 26, 32)
    for u in db.users.find({"age":{"$in":(23, 26, 32)}}): print u 
    # select * from users where age not in (23, 26, 32)
    for u in db.users.find({"age":{"$nin":(23, 26, 32)}}): print u 

(5)計數(shù),用到count()函數(shù)
    # select count(*) from users  查詢users表中所有的記錄的個數(shù)   
    print(db.users.find().count()) 

    # select count(*) from users where age > 30 查詢users表中age>30的記錄的個數(shù)
    print(db.users.find({"age":{"$gt":30}}).count()) 


(6)對記錄進行排序,用sort()函數(shù),形如find().sort('xx',1/-1),xx表示按xx的升序/降序排列,注意與后面的1/-1是用逗號(,)隔開
    pymongo.ASCENDING # 表按升序排列,也可以用 1 來代替
    pymongo.DESCENDING #表按降序排列, 也可以用 -1 來代替
    for u in db.users.find().sort([("age", pymongo.ASCENDING)]): print u  # select * from 集合名 order by 鍵1
    for u in db.users.find().sort([("age", pymongo.DESCENDING)]): print u # select * from 集合名 order by 鍵1 desc
    for u in db.users.find().sort([("鍵1", pymongo.ASCENDING), ("鍵2", pymongo.DESCENDING)]): print u # select * from 集合名 order by 鍵1 asc, 鍵2 desc

(7)從第幾行開始讀取(SLICE),讀取多少行(LIMIT)
    #從第2行開始讀取,讀取3行記錄
    for u in db.users.find().skip(2).limit(3): print u 
.
.

四. 多級路徑的元素值查詢

由于mongodb不支持表連接,所以文檔中采取 JSON 這種層級結(jié)構(gòu)存儲多層數(shù)據(jù),我們可以直接用嵌入(Embed)代替?zhèn)鹘y(tǒng)關系型數(shù)據(jù)庫的關聯(lián)引用(Reference)。

MongoDB 支持以 "." 分割的 namespace 路徑,但條件表達式中的多級路徑須用引號包括起來

(1)# 條件表達式中的多級路徑須用引號,以 "." 分割
    u = db.集合名.find_one({"im.qq":12345678})
    # 查詢結(jié)果如:{"_id" : ObjectId("4c479885089df9b53474170a"), "name" : "user1", "im" : {"msn" : "user1@hotmail.com", "qq" : 12345678}}

    print u['im']['msn']   #表打印出: user1@hotmail.com

(2)# 多級路徑的更新
    db.集合名.update({"im.qq":12345678}, {'$set':{"im.qq":12345}})

(3)for u in db.users.find({'data':"abc"}): print u
  # 顯示如: { "_id" : ObjectId("4c47a481b48cde79c6780df5"), "name" : "user8", "data" : [ { "a" : 1, "b" : 10 }, 3, "abc" ] }

五、mongodb中數(shù)據(jù)類型轉(zhuǎn)換

對于一條記錄x,若其字段'price'為string型,則可以如下轉(zhuǎn)換為int型。
     x['price']=int(x['price'])

$type: 用于判斷屬性類型。
    for u in db.users.find({'t':{'$type':1}}): print u # 查詢數(shù)字類型的
    for u in db.users.find({'t':{'$type':2}}): print u # 查詢字符串類型的
  各種類型值的代表值:
    double:1
    string: 2
    object: 3
    array: 4
    binary data: 5
    object id: 7
    boolean: 8
    date: 9
    null: 10

六、導入json格式數(shù)據(jù)到Mongodb中
(1)首先打開cmd,然后運行cd c:\mongodb(\server\3.2)\ bin,即cd到bin目錄下,不同的電腦中路徑可能不同。
(2)輸入命令:mongoimport --db ceshi --collection tongcheng --drop --file f:\xx.json
其中ceshi表示你將要在Mongo中新建的數(shù)據(jù)庫,tongcheng表示在ceshi數(shù)據(jù)庫下新建一個集合(即表),xx.json為要導入的數(shù)據(jù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容