今天是4.21號。
最近特別煩,不知是不是因為沒找到實習的緣故,加上論文還沒有消息回復。感覺馬上不是面臨找不到工作的壓力,就是可能畢不了業(yè)。看到周圍人都開始實習,自己在這里瞎折騰說不擔心是安慰自己裝出來的。
甚至開始懷疑自己到底能夠做什么,到底準備做什么。問問自己,一點底都沒有。技術(shù)技術(shù)做不了,產(chǎn)品產(chǎn)品做不了,想起去年這個時候也是在胡亂找實習,結(jié)果一事無成。
算了吧,最低要求,先把畢業(yè)要求達到再說,否則其他一切都是免談。可是那些雜志社敢不敢給我來個好消息,昂。
首先了解一下mongoDB中存儲數(shù)據(jù)時的一些概念
對于數(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ù)。