使用 mongolite R 将数据框附加到现有集合
Append a dataframe to existing collection using mongolite R
我有一个股票数据框,我已经加载到 mongodb。随着新信息的出现,我正在尝试附加行,其中每个新行都是不同的日期。但是,当我尝试插入新数据框时收到此错误:错误:E11000 重复键错误集合:timeSeries.patimeseries 索引:id dup 键:{ _id: "5fb69a960438522a0631cca2 " }
这是我目前正在做的事情
con = mongo(collection, db, url)
#look at existing data
con$find()
date Price Value2
2020-10-10 50 AAPL
2020-10-10 88 MSFT
2020-10-11 52 AAPL
2020-10-11 54 MSFT
我在 2020-10-13 收到了我想要插入的新数据。
print(new.df)
date price Value2
2020-10-12 56 AAPL
2020-10-12 92 MSFT
我做的第一件事是从我的数据库中删除日期“2020-10-13”,然后尝试插入新信息。
con$remove(
query = '{"date" : "2020-10-12"}'
)
con$insert(
new.df
)
Error: E11000 duplicate key error collection: timeSeries.patimeseries index: _id_ dup key: { _id: "5fb69a960438522a0631cca2" }
看起来您正在删除数据而不是数据上的索引。由于日期数据被索引为 _id,因此无法删除。 (参见 https://api.mongodb.com/wiki/current/Indexes.html#Indexes-The%5CidIndex)您是否尝试过使用更新查询,而不是尝试删除条目并在其位置创建一个新条目?
con$update('{"date" : "2020-10-13"}', '{"$set":{"price": 56}}')
有关文档,请参阅 https://jeroen.github.io/mongolite/manipulate-data.html#update-upsert。
注意: 如果您 运行 查询其中一些需要更新而另一些需要插入,您可以添加 upsert = TRUE
来执行插入,如果没有找到匹配的记录。
更新: 我没有看到任何执行批量更新的文档。一种解决方法(如果不可能)是将每个数据框转换为 json 字符串列表,如下所示:
library(rjson)
x <- split(df, 1:nrow(df))
json_strings <- lapply(x, toJSON)
在此示例中,每个 json 将由作为键的列名和作为相应值的一行数据组成,因此您可以循环并执行如下操作:
for (val in 1:length(df$date))
{
this_date <- df$date[val]
date_query <- paste('{"date" : ', as.character(this_date), '}')
set_query <- paste('{"$set":', json_strings[val], '}')
con$update(date_query, set_query)
}
可能有更简洁的方法来完成所有这些工作。例如,您可以重构因此没有循环,并使用 dplyr
动词(例如 mutate)来构造 json 字符串,但我们的想法是根据数据生成 json 字符串在数据框中,动态执行更新查询。
我有一个股票数据框,我已经加载到 mongodb。随着新信息的出现,我正在尝试附加行,其中每个新行都是不同的日期。但是,当我尝试插入新数据框时收到此错误:错误:E11000 重复键错误集合:timeSeries.patimeseries 索引:id dup 键:{ _id: "5fb69a960438522a0631cca2 " }
这是我目前正在做的事情
con = mongo(collection, db, url)
#look at existing data
con$find()
date Price Value2
2020-10-10 50 AAPL
2020-10-10 88 MSFT
2020-10-11 52 AAPL
2020-10-11 54 MSFT
我在 2020-10-13 收到了我想要插入的新数据。
print(new.df)
date price Value2
2020-10-12 56 AAPL
2020-10-12 92 MSFT
我做的第一件事是从我的数据库中删除日期“2020-10-13”,然后尝试插入新信息。
con$remove(
query = '{"date" : "2020-10-12"}'
)
con$insert(
new.df
)
Error: E11000 duplicate key error collection: timeSeries.patimeseries index: _id_ dup key: { _id: "5fb69a960438522a0631cca2" }
看起来您正在删除数据而不是数据上的索引。由于日期数据被索引为 _id,因此无法删除。 (参见 https://api.mongodb.com/wiki/current/Indexes.html#Indexes-The%5CidIndex)您是否尝试过使用更新查询,而不是尝试删除条目并在其位置创建一个新条目?
con$update('{"date" : "2020-10-13"}', '{"$set":{"price": 56}}')
有关文档,请参阅 https://jeroen.github.io/mongolite/manipulate-data.html#update-upsert。
注意: 如果您 运行 查询其中一些需要更新而另一些需要插入,您可以添加 upsert = TRUE
来执行插入,如果没有找到匹配的记录。
更新: 我没有看到任何执行批量更新的文档。一种解决方法(如果不可能)是将每个数据框转换为 json 字符串列表,如下所示:
library(rjson)
x <- split(df, 1:nrow(df))
json_strings <- lapply(x, toJSON)
在此示例中,每个 json 将由作为键的列名和作为相应值的一行数据组成,因此您可以循环并执行如下操作:
for (val in 1:length(df$date))
{
this_date <- df$date[val]
date_query <- paste('{"date" : ', as.character(this_date), '}')
set_query <- paste('{"$set":', json_strings[val], '}')
con$update(date_query, set_query)
}
可能有更简洁的方法来完成所有这些工作。例如,您可以重构因此没有循环,并使用 dplyr
动词(例如 mutate)来构造 json 字符串,但我们的想法是根据数据生成 json 字符串在数据框中,动态执行更新查询。