1. 程式人生 > >python3獲取MongoDB資料總結

python3獲取MongoDB資料總結

對這次挑戰做總結

新手,對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

的操作和mongo shell的操作不太一樣,在Python裡需要使用pipeline,把aggregate操作的語句放入pipeline裡,這個pipeline是一個包含dict的list,

   pipeline = [
			{"$group": {"_id": "$user_id", "totalscore": {"$sum": "$score"},
				             "totaltime": {"$sum": "$submit_time"}}},
            {"$sort": {"totalscore": -1, "totaltime": 1}}, 
       ]
     db.contests.aggregate(pipeline)

先按user_id進行分組,在後對scoretime進行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()  #刪除文件集合