我一直在使用Rmongo包从MongoDB中提取数据。
library(Rmongo)
mongo <- mongoDbConnect("cmdbData", host="XX-MONGODB-02", port=27017)
data_users <- dbGetQuery(mongo, 'computers', '{}')拉取的数据如下:
update_bol key cData
1 delete NA "{ \"name\" : \"name1\" , \"domain\" : \"xx.yy.dk\"}"
2 update NA "{ \"name\" : \"name2\" , \"domain\" : \"xx.yy.dk\"}"
3 update NA "{ \"name\" : \"name3\" , \"domain\" : \"xx.yy.dk\"}"
4 update NA "{ \"name\" : \"null\" , \"domain\" : \"xx.yy.dk\"}"
5 update NA "{ \"name\" : \"name5\" , \"domain\" : \"zz.yy.dk\"}"
6 delete NA "{ \"name\" : \"name6\" , \"domain\" : \"zz.yy.dk\"}"可以使用以下命令手动重新创建数据帧:
data.frame(update_bol = c("delete", "update", "update", "update", "update", "delete"),
key = c(NA, NA, NA, NA, NA, NA),
cData = c("{ \"name\" : \"name1\" , \"domain\" : \"xx.yy.dk\"}", "{ \"name\" : \"name2\" , \"domain\" : \"xx.yy.dk\"}", "{ \"name\" : \"name3\" , \"domain\" : \"xx.yy.dk\"}", "{ \"name\" : \"null\" , \"domain\" : \"xx.yy.dk\"}", "{ \"name\" : \"name5\" , \"domain\" : \"zz.yy.dk\"}", "{ \"name\" : \"name6\" , \"domain\" : \"zz.yy.dk\"}"), stringsAsFactors = FALSE)我想要这样的输出:
name domain
1 name1 xx.yy.dk
2 name2 xx.yy.dk
3 name3 xx.yy.dk
4 NULL xx.yy.dk
5 name5 zz.yy.dk
6 name6 zz.yy.dk我曾尝试进行更高级的查询,以便直接从dbGetQuery-function输出cData列,但我是MongoDB新手,似乎找不到合适的查询。
cData的格式看起来像JSON,所以我也尝试使用"jsonlite“包来提取列,但我也没能做到这一点。你有什么意见建议?
library(jsonlite)
library(tidyverse)
fromJSON(data_users$ciData[1]) %>% as.data.frame
Error in (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE, :
arguments imply differing number of rows: 1, 0发布于 2017-05-19 17:02:48
这可能不是最好的方法,但它会让你振作起来。在这种方法中,我将您拥有的数据转换为所需的格式。
df<-data.frame(update_bol = c("delete", "update", "update", "update", "update", "delete"),
key = c(NA, NA, NA, NA, NA, NA),
cData = c("{ \"name\" : \"name1\" , \"domain\" : \"xx.yy.dk\"}", "{ \"name\" : \"name2\" , \"domain\" : \"xx.yy.dk\"}", "{ \"name\" : \"name3\" , \"domain\" : \"xx.yy.dk\"}", "{ \"name\" : \"null\" , \"domain\" : \"xx.yy.dk\"}", "{ \"name\" : \"name5\" , \"domain\" : \"zz.yy.dk\"}", "{ \"name\" : \"name6\" , \"domain\" : \"zz.yy.dk\"}"), stringsAsFactors = FALSE)
clean<-function(x){
cleand_x<-gsub(pattern = '[\\{\\}\\"]',replacement = "",x = df$cData,fixed=F)
cleand_x<-strsplit(cleand_x,split = " ")
final<-sapply(cleand_x,function(t)
{
c(name=t[[4]],domain=t[[8]])
},simplify = T)
return(as.data.frame(t(final)))
}
clean(df)输出
name domain
1 name1 xx.yy.dk
2 name2 xx.yy.dk
3 name3 xx.yy.dk
4 name4 xx.yy.dk
5 name5 zz.yy.dk
6 name6 zz.yy.dk发布于 2017-06-13 05:09:11
我会推荐mongolite包而不是RMongo。您可以使用mongo查询将数据从mongodb中拉入到dataframe中。如果要查询包含数组的数据,则需要使用$unwind和可能的"flatten“(flatten来自jsonlite包)。
https://stackoverflow.com/questions/44064888
复制相似问题