如何使用 PyMongo 将文档添加到集合中的数组

How to add documents to an array in a collection using PyMongo

我已经将一个 txt 文件中的数据提取到一个 NumPy 数组中。我现在正尝试将此数据添加到现有集合中的一组嵌入式文档中。目前,该数组名为 "ratings" 并且仅包含一个包含空字段的文档。

代码如下:

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

好吧,我只能建议确保您的集合中有一个 _id 等于 row[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
        }  
    ]
}