python字典导入mongodb_python连接mongoDB进行数据提取→常用操作指南
1. 連接mongo
需要知道m(xù)ongoDB的地址、端口、授權(quán)用戶、授權(quán)密碼。一般情況下,技術(shù)都會給到數(shù)據(jù)分析人員這些信息。
python沒有安裝模塊pymongo模塊的,在cmd里面,pip install pymongo 進行安裝。(具體操作可以自行百度)
##導入連接mongo需要的模塊
from pymongo import MongoClient
###連接數(shù)據(jù)庫
client = MongoClient(地址, 端口)
####訪問數(shù)據(jù)庫授權(quán)
db_auth = client.admin ##哪個庫,這里是admin這個庫
db_auth.authenticate(授權(quán)用戶, 授權(quán)密碼)
2. 訪問數(shù)據(jù)集合并且提取數(shù)據(jù)
提取數(shù)據(jù)基本代碼框架如下面代碼示例:
collect10=db2.decisionResultData ##選擇某個某個數(shù)據(jù)集合進行訪問
###這里選擇decisionResultData數(shù)據(jù)集合(相當于mysql里面的數(shù)據(jù)表)進行訪問
dt= collect10.find({}) ###選擇訪問數(shù)據(jù)集合的所有數(shù)據(jù)
df_decision=pd.DataFrame(list(dt)) ####將這些數(shù)據(jù)轉(zhuǎn)化為DataFrame格式
加入某些限制條件進行數(shù)據(jù)提取,在find字典里面進行條件設置。
dt= collect10.find({某些條件}) ###選擇訪問數(shù)據(jù)集合中符合某些條件的數(shù)據(jù)
df_decision=pd.DataFrame(list(dt)) ####將這些數(shù)據(jù)轉(zhuǎn)化為DataFrame格式
3. 數(shù)據(jù)篩選條件
a. 大于/小于/等于條件
使用方式為:類似python中的字典嵌套字典的形式進行條件設置。
大于等于某個值
dt=collect10.find({'age':{'$gte':12
}
}
) ####年齡大于等于12歲
df_decision=pd.DataFrame(list(dt)) ####將這些數(shù)據(jù)轉(zhuǎn)化為DataFrame格式
小于某個值,將上面代碼中的 $gte 換為 $lt 即可
等于某個值,以字典形式傳入值即可
dt=collect10.find({'age':12
}
) ####查詢等于12歲的數(shù)據(jù)
df_decision=pd.DataFrame(list(dt)) ####將這些數(shù)據(jù)轉(zhuǎn)化為DataFrame格式
關于時間范圍的特殊示例。
Mongo數(shù)據(jù)集合中,有的是沒有儲存時間的,為了選取一定時間范圍內(nèi)的數(shù)據(jù),可以利用集合表中的_id來進行時間范圍的選擇。
【_id是一個ObjectId類型的主鍵,其前4個字節(jié)是UNIX時間戳 ?!?/p>
如果需要選擇大于某個時間點后面的數(shù)據(jù),根據(jù)需要的時間,生成一個ObjectId,條件設置為_id 大于這個ObjectId即可。
代碼示例:
def object_id_from_datetime(from_datetime=None,span_days=0,span_hours=0,span_minutes=0,span_seconds=0,span_weeks=0):
'''根據(jù)時間手動生成一個objectid,此id不作為存儲使用'''
if not from_datetime:
from_datetime = datetime.datetime.now()
from_datetime = from_datetime + datetime.timedelta(days=span_days,hours=span_hours,minutes=span_minutes,weeks=span_weeks)
return ObjectId.from_datetime(generation_time=from_datetime)
begin_date = input('請輸入開始日期,格式例如:2017-01-31 00:00:00 :')
begin_date=object_id_from_datetime(datetime.datetime.strptime(begin_date,'%Y-%m-%d%H:%M:%S')-datetime.timedelta(hours=8))###減8個小時
dt= collect10.find({'_id':{'$gte':begin_date}}) ###大于等于開始時間的數(shù)據(jù)篩選條件
df_decision=pd.DataFrame(list(dt))###將數(shù)據(jù)轉(zhuǎn)化為DataFrame格式
b. 包括/不包括條件
字典嵌套,'$in'的值為列表形式。
dt=collect10.find({'companyId':{'$in':['001','002']
}
}) ###提取companyId為001和002的數(shù)據(jù)
df_comp=pd.DataFrame(list(dt)) ####將這些數(shù)據(jù)轉(zhuǎn)化為DataFrame格式
不在某些值中,將上面代碼中的 $in 換為 $nin 即可。
c. 加入and /or 邏輯條件
并且的邏輯。字典里面的逗號就是表示and的邏輯。
dt=collect10.find({'age':{'$gte':12
,'$lte':18
}
}####年齡大于等于12歲并且小于等于18歲
)
df_decision=pd.DataFrame(list(dt)) ####將這些數(shù)據(jù)轉(zhuǎn)化為DataFrame格式
或則和的邏輯。or字典,值為列表形式,列表里面以字典鍵值對形式進行或者條件的設置。
dt= collect10.find({'$or':[{'description':'BB'}
,{'name':'AA'}
]
})### description等于BB 并且 name等于AA的數(shù)據(jù)
df_3=pd.DataFrame(list(dt))
d. 限制輸出條數(shù)
使用limit(number),number表示限制的條數(shù)??梢韵瓤纯磾?shù)據(jù)輸出的格式。
dt= collect10.find({'$or':[{'description':'BB'}
,{'name':'AA'}
]
}).limit(10) ### 只輸出條數(shù)為10條
df_3=pd.DataFrame(list(dt))
e. 選擇字段進行輸出
可以不輸出該數(shù)據(jù)集合中的所有字段,篩選某些字段輸出。
格式為:collect2.find({ 篩選條件},{'字段A':1, '字段B':0,'字段C':1})。
在篩選條件之后,增加字段是否顯示的字典鍵值對,0表示不顯示(不輸出),1表示顯示(輸出)。
dt=collect2.find({'$or':[{'description':'BB'}
,{'name':'AA'}
]
}
,{'name':1
,'_id':0
,'status':1
,'requestDuration':1
}
)
###選擇description為BB或則name為AA的數(shù)據(jù),并且只顯示name、description、requestDuration這3個字段。
df_3=pd.DataFrame(list(dt))
f. 進行排序
使用的格式為:
按照某個字段升序排列:
訪問的集合命名.find({}).sort('字段名稱',pymongo.DESCENDING)
按照某個字段降序排列:
訪問的集合命名.find({}).sort('字段名稱',pymongo. ASCENDING)
多個字段綜合排序:
訪問的集合命名.find({}).sort([('字段A',pymongo.DESCENDING)
,('字段B',pymongo.ASCENDING)
,……
]
)
使用sort和limit 結(jié)合,可以輸出某些排序靠前的數(shù)據(jù)。經(jīng)常用來查看最近時間產(chǎn)生的一些數(shù)據(jù)。
以下代碼選取最近10條數(shù)據(jù)。
#訪問data這個數(shù)據(jù)庫
db2=client['data']
###訪問這個文檔,數(shù)據(jù)調(diào)取記錄
collect2=db2.loggerModel
dt= collect2.find({}).sort('_id',pymongo.DESCENDING).limit(10)
#pymongo.DESCENDING 表述倒敘 # pymongo.ASCENDING表示升序
df_3=pd.DataFrame(list(dt))
g. 統(tǒng)計一共多少條數(shù)據(jù)
代碼格式有兩種:訪問的集合命名.find({ 篩選條件}).count()
訪問的集合命名.count_documents({篩選條件})
這兩個代碼當前都可以不報錯,但是第一個會提醒你,這個格式已經(jīng)被取代了,建議使用第二個格式。大家還是習慣使用第二個吧。
#訪問data這個數(shù)據(jù)庫
db2=client['data']
###訪問這個文檔,數(shù)據(jù)調(diào)取記錄
collect2=db2.loggerModel
collect2.count_documents({'$or':[{'description':'BB'}
,{'name':'AA'}
]
})
121963 ###輸出結(jié)果,一共有121963條
h. 聚合計算,實現(xiàn)與sql代碼一樣的數(shù)據(jù)提取邏輯
使用aggregate(),使用格式為:
aggregate([操作標識1: {操作1}
,操作標識2: {操作2}
,操作標識3: {操作3}
,……
])
aggregate是一個管道的概念,操作1的輸出結(jié)果作為操作2的輸入數(shù)據(jù),操作2的輸出結(jié)果作為操作3的輸入數(shù)據(jù),以此類推。
aggregate 操作標識:
$project:修改輸入文檔的結(jié)構(gòu)。可以用來重命名、增加或刪除域,也可以用于創(chuàng)建計算結(jié)果以及嵌套文檔。
$match:用于過濾數(shù)據(jù),只輸出符合條件的文檔。$match使用MongoDB的標準查詢操作。
$limit:用來限制MongoDB聚合管道返回的文檔數(shù)。
$skip:在聚合管道中跳過指定數(shù)量的文檔,并返回余下的文檔。
$unwind:將文檔中的某一個數(shù)組類型字段拆分成多條,每條包含數(shù)組中的一個值。
$group:將集合中的文檔分組,可用于統(tǒng)計結(jié)果。
$sort:將輸入文檔排序后輸出。
$geoNear:輸出接近某一地理位置的有序文檔。
在數(shù)據(jù)提取的時候,常用的操作標識有:$project、$match、$limit、 $group、$sort
$project
常用來篩選字段,以下代碼表示只顯示name、description、_id三個字段。(_id是默認顯示的)
collect2.aggregate([{'$project':{'name':1
, 'description':1}
}
])
$match
數(shù)據(jù)過濾的操作,類似于sql的where條件,篩選條件的篩選方式如前面a、b、c所述。
collect2.aggregate([{'$match':{篩選條件}}
])
$limit
限制輸出的條數(shù)
collect2.aggregate([{'$limit':10}
]) ##顯示輸出10條
$group
實現(xiàn)sql里面group by 的功能。
collect2.aggregate([{'$group': {'_id':"$字段名1" ##字段名稱固定為'_id'
,'取個名字2':{'$聚合方式': '$字段名2'}
,'取個名字3':{'$聚合方式': '$字段名3'}
}
}
])
其中,字段名1為聚合的字段,也就是sql里面group by 后面的字段。字段名2是需要進行統(tǒng)計的字段。
示例如下:
dt=collect2.aggregate([{'$match':{'_id':{'$gte':begin_date}}} ##選擇某個時間段之后的
,{'$group':{'_id':"$description"
,'num':{'$sum':1}
}
} ##統(tǒng)計有多少條數(shù)據(jù),相當于count(1)
])
df_4=pd.DataFrame(list(dt))
多字段group by 的情況,'_id'的值變?yōu)樽值滏I值對,字典里面鍵值對形式為'取個字段名稱': '$字段名'。
示例為:
dt=collect2.aggregate([{'$match':{'_id':{'$gte':begin_date}}} ##選擇某個時間段之后的
,{'$group':{'_id':{'description':"$description"
,'thirdPart':"$thirdPart"}
,'num':{'$sum': '$number'}
,'avgnum':{'$avg':'$number'}
,'minnum':{'$min':'$number'}
}
} ##group by description, thirdPart,對number字段進行求和、平均值、最小值操作
])
df_4=pd.DataFrame(list(dt))
聚合方式:
$max:返回最大值
$min:返回最小值
$avg:返回平均值
$sum:求和的操作
$first:第一個文檔數(shù)據(jù)
$last:最后一個文檔數(shù)據(jù)
$sort
排序,基本格式為:
collect2.aggregate([{'$ sort':{'字段名':1}}
])
按照字段名升序排列 ,1表示升序,-1表示降序
示例如下,按照條件篩選后,統(tǒng)計description分別的個數(shù),再按照個數(shù)升序。
Sql代碼邏輯:
select description
,count(*) num
from collect2
where _id>= begin_date
and _id<= end_date
and (description='BB' or name in ('AA','CC'))
group by description
order by count(*)
mongo代碼實現(xiàn):
dt=collect2.aggregate([{'$match':{'_id':{'$gte':begin_date
,'$lte':end_date}
,'$or':[{'description':'BB'}
,{'name':{'$in':['AA','CC']} }
]
}
}####先進行條件篩選
,{'$group':{'_id':"$description",'num':{'$sum':1}}}
,{'$sort':{'num':-1} }
])
df_4=pd.DataFrame(list(dt))
總結(jié)
以上是生活随笔為你收集整理的python字典导入mongodb_python连接mongoDB进行数据提取→常用操作指南的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 已知矩阵 matlab,在MATLAB中
- 下一篇: vsc写vue生成基本代码快捷键_基于v