2016-02-21 67 views
2

我已經將數據從txt文件提取到NumPy數組中。我現在試圖將這些數據添加到已存在集合中的嵌入文檔數組中。目前,該數組被命名爲「收視率」,並且只保存一個空字段的文檔。如何將文檔添加到使用PyMongo的集合中的數組

下面是代碼:

ratings = np.loadtxt('outfile_ratings.sql', skiprows=1) 

fn = 'outfile_users.sql' 
with open(fn, encoding="utf-8") as f: lines = f.readlines() 

[l.strip().split("\t") for l in lines] 
users = np.array([l.strip().split("\t") for l in lines]) 

dbClient = pm.MongoClient() 
db = dbClient['moviesDat'] 
col = db['usersDat'] 

for i in range(1, 944): 
    if np.size(users[i][:]) == 5: 
     resInsert = col.insert_one({"_id": users[i][0]}) 

for i in range(1, 944): 
    if np.size(users[i][:]) == 5: 
     resUpdate = col.update_one({"_id": users[i][0]}, 
            {"$set": {"age": users[i][1], 
              "gender": users[i][2], 
              "occupation": users[i][3], 
              "zip_code": users[i][4]}}) 

for row in ratings: 
    resUpdate = col.update_one({"_id": row[0]}, 
           {"$addToSet": {"ratings": {"rating": " ", 
                  "movie_id": " ", 
                  "timestamp": " "}}}) 

for row in ratings: 
    resUpdate = col.update_one({"_id": str(row[0])}, 
           {"$push": { "ratings": {"rating": row[2], 
                  "movie_id": row[1], 
                  "timestamp": row[3]}}}) 

在最後調用update_one()我使用$push運營商的值添加到嵌入文檔字段,但沒有效果。

如何將數據添加到我的集合中的數組?

編輯:...和數據集文件:

outfile_ratings.sql: 

user movie rating timestamp 
1 1 5 874965758 
1 2 3 876893171 
1 3 4 878542960 
1 4 3 876893119 
1 5 3 889751712 
1 6 5 887431973 
1 7 4 875071561 
1 8 1 875072484 

outfile_users.sql: 

id age gender occupation zip_code 
1 24 M technician 85711 
2 53 F other 94043 
3 23 M writer 32067 
4 24 M technician 43537 
5 33 F other 15213 
6 42 M executive 98101 
7 57 M administrator 91344 
+0

您可以將樣本數據集? outfile_user.sql的內容。如果你的數據集不是太大,你也可以使用$ push $ each語法一次傳遞整個數組,並讓mongodb擴展數組。 – Saleem

+0

我將如何包含數據集文件? – AutomEng

+1

只是粘貼在幾行以上。 – Saleem

回答

1

好吧,我只能建議,以確保您的集合,其_id是等於[0]行中的一個文件。如果此文檔不存在,則不會有update_one的影響。

我修改了一些代碼(主要是如何獲取數據庫和集合),它看起來像這樣。

from pymongo import MongoClient 

mongoServer = "mongodb://localhost:27017" 
mongoDb = "moviesDat" 
mongoCol = "userDat" 

client = MongoClient(mongoServer) 
db = client.get_database(mongoDb) 
col = db.get_collection(mongoCol) 
rattings = [] 

# Data generation for testing purpose.  
# for i in range(1, 4): 
#  rattings.append([0, i*1, i*2, i*3]) 

# assuming rattings is a valid collection with valid data 
for row in rattings: 
    col.update_one({"_id": row[0]}, {"$push": {"rattings": {"ratting": row[1], "movie_id": row[2], "timestamp": row[3]}}}) 

我可以看到它將行推向集合。

userDat集合應該是這樣的:

{ 
    "_id" : 0.0, 
    "producer" : "james", 
    "rattings" : [ 
     { 
      "timestamp" : 3, 
      "movie_id" : 2, 
      "ratting" : 1 
     }, 
     { 
      "timestamp" : 6, 
      "movie_id" : 4, 
      "ratting" : 2 
     }, 
     { 
      "timestamp" : 9, 
      "movie_id" : 6, 
      "ratting" : 3 
     } 
    ] 
} 
相關問題