2016-02-21 37 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 
     } 
    ] 
} 
相关问题