日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python字典导入mongodb_python连接mongoDB进行数据提取→常用操作指南

發布時間:2025/3/15 python 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python字典导入mongodb_python连接mongoDB进行数据提取→常用操作指南 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 連接mongo

需要知道mongoDB的地址、端口、授權用戶、授權密碼。一般情況下,技術都會給到數據分析人員這些信息。

python沒有安裝模塊pymongo模塊的,在cmd里面,pip install pymongo 進行安裝。(具體操作可以自行百度)

##導入連接mongo需要的模塊

from pymongo import MongoClient

###連接數據庫

client = MongoClient(地址, 端口)

####訪問數據庫授權

db_auth = client.admin ##哪個庫,這里是admin這個庫

db_auth.authenticate(授權用戶, 授權密碼)

2. 訪問數據集合并且提取數據

提取數據基本代碼框架如下面代碼示例:

collect10=db2.decisionResultData ##選擇某個某個數據集合進行訪問

###這里選擇decisionResultData數據集合(相當于mysql里面的數據表)進行訪問

dt= collect10.find({}) ###選擇訪問數據集合的所有數據

df_decision=pd.DataFrame(list(dt)) ####將這些數據轉化為DataFrame格式

加入某些限制條件進行數據提取,在find字典里面進行條件設置。

dt= collect10.find({某些條件}) ###選擇訪問數據集合中符合某些條件的數據

df_decision=pd.DataFrame(list(dt)) ####將這些數據轉化為DataFrame格式

3. 數據篩選條件

a. 大于/小于/等于條件

使用方式為:類似python中的字典嵌套字典的形式進行條件設置。

大于等于某個值

dt=collect10.find({'age':{'$gte':12

}

}

) ####年齡大于等于12歲

df_decision=pd.DataFrame(list(dt)) ####將這些數據轉化為DataFrame格式

小于某個值,將上面代碼中的 $gte 換為 $lt 即可

等于某個值,以字典形式傳入值即可

dt=collect10.find({'age':12

}

) ####查詢等于12歲的數據

df_decision=pd.DataFrame(list(dt)) ####將這些數據轉化為DataFrame格式

關于時間范圍的特殊示例。

Mongo數據集合中,有的是沒有儲存時間的,為了選取一定時間范圍內的數據,可以利用集合表中的_id來進行時間范圍的選擇。

【_id是一個ObjectId類型的主鍵,其前4個字節是UNIX時間戳 。】

如果需要選擇大于某個時間點后面的數據,根據需要的時間,生成一個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):

'''根據時間手動生成一個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}}) ###大于等于開始時間的數據篩選條件

df_decision=pd.DataFrame(list(dt))###將數據轉化為DataFrame格式

b. 包括/不包括條件

字典嵌套,'$in'的值為列表形式。

dt=collect10.find({'companyId':{'$in':['001','002']

}

}) ###提取companyId為001和002的數據

df_comp=pd.DataFrame(list(dt)) ####將這些數據轉化為DataFrame格式

不在某些值中,將上面代碼中的 $in 換為 $nin 即可。

c. 加入and /or 邏輯條件

并且的邏輯。字典里面的逗號就是表示and的邏輯。

dt=collect10.find({'age':{'$gte':12

,'$lte':18

}

}####年齡大于等于12歲并且小于等于18歲

)

df_decision=pd.DataFrame(list(dt)) ####將這些數據轉化為DataFrame格式

或則和的邏輯。or字典,值為列表形式,列表里面以字典鍵值對形式進行或者條件的設置。

dt= collect10.find({'$or':[{'description':'BB'}

,{'name':'AA'}

]

})### description等于BB 并且 name等于AA的數據

df_3=pd.DataFrame(list(dt))

d. 限制輸出條數

使用limit(number),number表示限制的條數。可以先看看數據輸出的格式。

dt= collect10.find({'$or':[{'description':'BB'}

,{'name':'AA'}

]

}).limit(10) ### 只輸出條數為10條

df_3=pd.DataFrame(list(dt))

e. 選擇字段進行輸出

可以不輸出該數據集合中的所有字段,篩選某些字段輸出。

格式為: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的數據,并且只顯示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 結合,可以輸出某些排序靠前的數據。經常用來查看最近時間產生的一些數據。

以下代碼選取最近10條數據。

#訪問data這個數據庫

db2=client['data']

###訪問這個文檔,數據調取記錄

collect2=db2.loggerModel

dt= collect2.find({}).sort('_id',pymongo.DESCENDING).limit(10)

#pymongo.DESCENDING 表述倒敘 # pymongo.ASCENDING表示升序

df_3=pd.DataFrame(list(dt))

g. 統計一共多少條數據

代碼格式有兩種:訪問的集合命名.find({ 篩選條件}).count()

訪問的集合命名.count_documents({篩選條件})

這兩個代碼當前都可以不報錯,但是第一個會提醒你,這個格式已經被取代了,建議使用第二個格式。大家還是習慣使用第二個吧。

#訪問data這個數據庫

db2=client['data']

###訪問這個文檔,數據調取記錄

collect2=db2.loggerModel

collect2.count_documents({'$or':[{'description':'BB'}

,{'name':'AA'}

]

})

121963 ###輸出結果,一共有121963條

h. 聚合計算,實現與sql代碼一樣的數據提取邏輯

使用aggregate(),使用格式為:

aggregate([操作標識1: {操作1}

,操作標識2: {操作2}

,操作標識3: {操作3}

,……

])

aggregate是一個管道的概念,操作1的輸出結果作為操作2的輸入數據,操作2的輸出結果作為操作3的輸入數據,以此類推。

aggregate 操作標識:

$project:修改輸入文檔的結構。可以用來重命名、增加或刪除域,也可以用于創建計算結果以及嵌套文檔。

$match:用于過濾數據,只輸出符合條件的文檔。$match使用MongoDB的標準查詢操作。

$limit:用來限制MongoDB聚合管道返回的文檔數。

$skip:在聚合管道中跳過指定數量的文檔,并返回余下的文檔。

$unwind:將文檔中的某一個數組類型字段拆分成多條,每條包含數組中的一個值。

$group:將集合中的文檔分組,可用于統計結果。

$sort:將輸入文檔排序后輸出。

$geoNear:輸出接近某一地理位置的有序文檔。

在數據提取的時候,常用的操作標識有:$project、$match、$limit、 $group、$sort

$project

常用來篩選字段,以下代碼表示只顯示name、description、_id三個字段。(_id是默認顯示的)

collect2.aggregate([{'$project':{'name':1

, 'description':1}

}

])

$match

數據過濾的操作,類似于sql的where條件,篩選條件的篩選方式如前面a、b、c所述。

collect2.aggregate([{'$match':{篩選條件}}

])

$limit

限制輸出的條數

collect2.aggregate([{'$limit':10}

]) ##顯示輸出10條

$group

實現sql里面group by 的功能。

collect2.aggregate([{'$group': {'_id':"$字段名1" ##字段名稱固定為'_id'

,'取個名字2':{'$聚合方式': '$字段名2'}

,'取個名字3':{'$聚合方式': '$字段名3'}

}

}

])

其中,字段名1為聚合的字段,也就是sql里面group by 后面的字段。字段名2是需要進行統計的字段。

示例如下:

dt=collect2.aggregate([{'$match':{'_id':{'$gte':begin_date}}} ##選擇某個時間段之后的

,{'$group':{'_id':"$description"

,'num':{'$sum':1}

}

} ##統計有多少條數據,相當于count(1)

])

df_4=pd.DataFrame(list(dt))

多字段group by 的情況,'_id'的值變為字典鍵值對,字典里面鍵值對形式為'取個字段名稱': '$字段名'。

示例為:

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:第一個文檔數據

$last:最后一個文檔數據

$sort

排序,基本格式為:

collect2.aggregate([{'$ sort':{'字段名':1}}

])

按照字段名升序排列 ,1表示升序,-1表示降序

示例如下,按照條件篩選后,統計description分別的個數,再按照個數升序。

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代碼實現:

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))

總結

以上是生活随笔為你收集整理的python字典导入mongodb_python连接mongoDB进行数据提取→常用操作指南的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 在线激情av| 久久久久久麻豆 | 天天看片天天操 | 丁香综合| 国产综合精品一区二区三区 | 亚洲第一福利视频 | 伊人在线| 国产伦精品一区二区三区免费迷 | 91精品人妻一区二区三区 | 国产手机在线播放 | 日本打屁股网站 | 国产成年无码久久久久毛片 | 中文字幕一区二区三区久久久 | 国产寡妇色xxⅹ交肉视频 | 日美av| 瑟瑟网站在线观看 | 懂色av蜜臀av粉嫩av分享 | 无码人妻丰满熟妇啪啪 | 波多野结衣中文字幕一区二区三区 | 日本高清视频免费看 | 日韩极品一区 | 婷婷一级片 | 很黄的性视频 | 99热com| 男女啪啪在线观看 | 日本丰满少妇裸体自慰 | 黄色精品视频在线观看 | 国产精品久久久久久中文字 | 你懂的在线播放 | 国产视频一区二区三 | 法国空姐在线观看免费 | 亚洲天堂五月 | 久久电影一区二区 | www.999av| 美女无遮挡免费网站 | 日韩一区二区三区视频在线观看 | 欧美精品999 | 精品国精品国产自在久不卡 | 91蜜臀精品国产自偷在线 | www.自拍 | 国产精品图片 | 在线91观看 | 精品在线视频一区二区三区 | 日韩成人专区 | 91影院在线播放 | 青青青手机视频在线观看 | 精品久久无码视频 | 亚洲一区二区观看 | 亚洲日本久久 | 吃瓜网今日吃瓜 热门大瓜 色婷在线 | 在线看片黄| 久草视频免费 | av视觉盛宴 | 色戒电影未测减除版 | 亚洲一区黄色 | 久久高清国产 | 久久无码人妻一区二区三区 | 国产v亚洲v天堂无码久久久 | 国产欧美123| 青青草毛片 | 国产不卡视频一区二区三区 | 亚洲第九十九页 | 999国产精品亚洲77777 | 欧美日韩黑人 | 国产奶水涨喷在线播放 | 日日狠狠久久偷偷四色综合免费 | 亚洲第一二区 | 亚洲精品中文字幕乱码三区91 | 中文乱码人妻一区二区三区视频 | 日韩有码一区 | 亚洲AV永久无码国产精品国产 | 中文字幕日韩一区 | 亚洲精品影片 | 国产乱码精品一区二区三区精东 | 深夜视频免费在线观看 | 成年人av| 亚洲美女免费视频 | 日本女优网址 | 青青草综合在线 | 欧美成人三级视频 | 麻豆网站| 亚洲精品黄色 | 视色网| 99久久久无码国产精品免费麻豆 | 老太脱裤让老头玩ⅹxxxx | 一本大道久久精品 | 花房姑娘免费观看全集 | 蜜臀网在线 | 玉足调教丨vk24分钟 | 在线看a网站 | 秋霞成人| 粗大的内捧猛烈进出 | 一区二区三区欧美日韩 | 白浆一区| 福利一二区 | 国产青青草视频 | 亚洲精品人 | 亚洲精品国偷拍自产在线观看蜜桃 | 日韩欧|