如何使用 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
}
]
}
我已经将一个 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
}
]
}