python3獲取MongoDB資料總結
阿新 • • 發佈:2018-12-19
對這次挑戰做總結
新手,對MongoDB不是特別熟,查了好多資料看了一些MongoDB的API,在此做個記錄。
啟動MongoDB服務,匯入資料
sudo service mongod start
mongoimport --db shiyanlou --collection contests --file /home/shiyanlou/Code/contests.json --jsonArray
MongoDB資料aggregate操作
挑戰的要求是給一系列含有user_id
和分數score
以及學習時間time
的使用者資料,輸入任意使用者的user_id
,返回rank
和分數和以及時間和(一個使用者可能含有多條記錄), 這邊最後的思路是對資料進行aggregate操作,pymongo
pipeline = [ {"$group": {"_id": "$user_id", "totalscore": {"$sum": "$score"}, "totaltime": {"$sum": "$submit_time"}}}, {"$sort": {"totalscore": -1, "totaltime": 1}}, ] db.contests.aggregate(pipeline)
先按user_id
進行分組,在後對score
和time
進行sum求和,這裡發現並沒有按照totalscore降序排列,totaltime升序排列,查詢原因發現:在mongo shell裡,totalscore在前面就表示先排序,totaltime在後面後排序,但是在Python裡,dict並沒有維護這種順序,所以上述在mongo shell裡的這種順序關係在Python中不能保證,需要使用SON 或 collections.OrderedDictpymongo聚合操作,具體如下:
from bson.son import SON pipeline = [ {"$group": {"_id": "$user_id", "totalscore": {"$sum": "$score"}, "totaltime": {"$sum": "$submit_time"}}}, {"$sort": SON([("totalscore",-1),("totaltime",1)])}, ]
就可以了,但是這種操作結果把rank體現在行的記錄上,第一個記錄就是就是第一名,所以想著把記錄存到另一個collections裡,然後讀出資料。
pymongo 一些操作
from pymongo import MongoClient
connection = MongoClient('localhost', 27017) #Connect to mongodb
connection.database_names() 等價 show dbs
db = connection['testdb1'] 等價 use testdb1
db.collection_names() 等價 show collections
print("posts" in db.collection_names()) #Check if collection "posts"
collection = db['posts']
print(collection.count() == 0) #檢查文件集合的文件數
collection.drop() #刪除文件集合