今天是4.21號(hào)憋沿。
最近特別煩,不知是不是因?yàn)闆](méi)找到實(shí)習(xí)的緣故谨朝,加上論文還沒(méi)有消息回復(fù)卤妒。感覺(jué)馬上不是面臨找不到工作的壓力,就是可能畢不了業(yè)字币。看到周?chē)硕奸_(kāi)始實(shí)習(xí)共缕,自己在這里瞎折騰說(shuō)不擔(dān)心是安慰自己裝出來(lái)的洗出。
甚至開(kāi)始懷疑自己到底能夠做什么,到底準(zhǔn)備做什么图谷。問(wèn)問(wèn)自己翩活,一點(diǎn)底都沒(méi)有阱洪。技術(shù)技術(shù)做不了,產(chǎn)品產(chǎn)品做不了菠镇,想起去年這個(gè)時(shí)候也是在胡亂找實(shí)習(xí)冗荸,結(jié)果一事無(wú)成。
算了吧利耍,最低要求蚌本,先把畢業(yè)要求達(dá)到再說(shuō),否則其他一切都是免談隘梨〕贪可是那些雜志社敢不敢給我來(lái)個(gè)好消息,昂轴猎。
首先了解一下mongoDB中存儲(chǔ)數(shù)據(jù)時(shí)的一些概念
對(duì)于數(shù)據(jù)庫(kù)的操作無(wú)外乎對(duì)表(集合)的操作和對(duì)數(shù)據(jù)(文檔)的操作嵌莉。在python中進(jìn)行下面的所有操作前,先必須有這幾條語(yǔ)句:
import pymongo
#與mongodb服務(wù)器建立連接
connection = pymongo.MongoClient('localhost', 27017)
student=connection['student'] #新建一個(gè)名為student的數(shù)據(jù)庫(kù)
或直接連接已有數(shù)據(jù)庫(kù)捻脖,類(lèi)似db = connection['tongcheng'],再直接使用數(shù)據(jù)庫(kù)的表content锐峭,infor=db['content']
connection.drop_database('student') #將名為student的數(shù)據(jù)庫(kù)刪除掉
#下面以student庫(kù)以及庫(kù)中的users集合(表)進(jìn)行講解:
一. 建表、刪除表可婶;
# 建立名為users的集合(表)沿癞,同建立數(shù)據(jù)庫(kù)形式一樣
users=student['users']
# 刪除users集合
student.users.drop()
二. 插入、刪除扰肌、更新記錄(文檔)抛寝;
(1)對(duì)建好的集合中插入數(shù)據(jù),用insert(),insert_one()函數(shù)
users.insert_one({'nickname':'namei'}) #一般要在表前加上數(shù)據(jù)庫(kù)的名稱(chēng)即
student.users.insert_one({'nickname':'namei'})
(2)刪除集合中的文檔曙旭,用remove()函數(shù)盗舰,刪除后的文檔無(wú)法恢復(fù)
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: 需要被更新的條件表達(dá)式
objNew: 更新表達(dá)式
upsert: 如目標(biāo)記錄不存在钻趋,是否插入新文檔。
multi: 是否更新多個(gè)文檔剂习。
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ù)的查詢(xún),這也是數(shù)據(jù)庫(kù)操作的重點(diǎn)
基本上是用find()函數(shù)進(jìn)行查詢(xún)鳞绕,其中大于失仁、大于等于、小于们何、小于等于這些關(guān)系運(yùn)算符經(jīng)常要用到萄焦,
分別用'$gt','$gte','$lt','$lte'表示。
(1)查詢(xún)顯示符合條件的記錄
# 查詢(xún) age 小于 15 的
for u in student.users.find({"age":{"$lt":15}}): print u
# 查詢(xún) name 等于 user8 的
for u in student.users.find({"name":"user8"}): print u
# 獲取查詢(xún)的一個(gè)記錄 (注意用find_one()而不是find())
u2 = student.users.find_one({"name":"user9"}) # 查不到時(shí)返回 None
print u2
(2)查詢(xún)符合條件的特定鍵 (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"]中可以是一個(gè)拂封,也可以是多個(gè)茬射;同時(shí)["name", "age"]是放在條件{}外的。
(3)多條件查詢(xún)(Conditional Operators) # like 的可使用正則表達(dá)式查詢(xún)
# 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ù)時(shí)在抛,對(duì)應(yīng)的條件都是以字典形式表示{'age':{'$gt':12},'xx':'xx'},
有多個(gè)條件時(shí)萧恕,都放在一個(gè){}內(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)計(jì)數(shù)刚梭,用到count()函數(shù)
# select count(*) from users 查詢(xún)users表中所有的記錄的個(gè)數(shù)
print(db.users.find().count())
# select count(*) from users where age > 30 查詢(xún)users表中age>30的記錄的個(gè)數(shù)
print(db.users.find({"age":{"$gt":30}}).count())
(6)對(duì)記錄進(jìn)行排序,用sort()函數(shù)廊鸥,形如find().sort('xx',1/-1)望浩,xx表示按xx的升序/降序排列,注意與后面的1/-1是用逗號(hào)(惰说,)隔開(kāi)
pymongo.ASCENDING # 表按升序排列磨德,也可以用 1 來(lái)代替
pymongo.DESCENDING #表按降序排列, 也可以用 -1 來(lái)代替
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)從第幾行開(kāi)始讀取(SLICE)吆视,讀取多少行(LIMIT)
#從第2行開(kāi)始讀取典挑,讀取3行記錄
for u in db.users.find().skip(2).limit(3): print u
.
.
四. 多級(jí)路徑的元素值查詢(xún)
由于mongodb不支持表連接,所以文檔中采取 JSON 這種層級(jí)結(jié)構(gòu)存儲(chǔ)多層數(shù)據(jù)啦吧,我們可以直接用嵌入(Embed)代替?zhèn)鹘y(tǒng)關(guān)系型數(shù)據(jù)庫(kù)的關(guān)聯(lián)引用(Reference)您觉。
MongoDB 支持以 "." 分割的 namespace 路徑,但條件表達(dá)式中的多級(jí)路徑須用引號(hào)包括起來(lái)
(1)# 條件表達(dá)式中的多級(jí)路徑須用引號(hào),以 "." 分割
u = db.集合名.find_one({"im.qq":12345678})
# 查詢(xún)結(jié)果如:{"_id" : ObjectId("4c479885089df9b53474170a"), "name" : "user1", "im" : {"msn" : "user1@hotmail.com", "qq" : 12345678}}
print u['im']['msn'] #表打印出: user1@hotmail.com
(2)# 多級(jí)路徑的更新
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ù)類(lèi)型轉(zhuǎn)換
對(duì)于一條記錄x琳水,若其字段'price'為string型,則可以如下轉(zhuǎn)換為int型般堆。
x['price']=int(x['price'])
$type: 用于判斷屬性類(lèi)型在孝。
for u in db.users.find({'t':{'$type':1}}): print u # 查詢(xún)數(shù)字類(lèi)型的
for u in db.users.find({'t':{'$type':2}}): print u # 查詢(xún)字符串類(lèi)型的
各種類(lèi)型值的代表值:
double:1
string: 2
object: 3
array: 4
binary data: 5
object id: 7
boolean: 8
date: 9
null: 10
六、導(dǎo)入json格式數(shù)據(jù)到Mongodb中
(1)首先打開(kāi)cmd淮摔,然后運(yùn)行cd c:\mongodb(\server\3.2)\ bin私沮,即cd到bin目錄下,不同的電腦中路徑可能不同和橙。
(2)輸入命令:mongoimport --db ceshi --collection tongcheng --drop --file f:\xx.json
其中ceshi表示你將要在Mongo中新建的數(shù)據(jù)庫(kù)仔燕,tongcheng表示在ceshi數(shù)據(jù)庫(kù)下新建一個(gè)集合(即表),xx.json為要導(dǎo)入的數(shù)據(jù)魔招。