R和MongoDB:数组存储为索引作为键的对象
问题描述:
我从提供程序中提取JSON数据并将其添加到使用R的mongodb中。我计划在未来使用R和Shiny显示数据。尽管我将数据放入JSON对象并将其插入到MongoDB中,但我现在仍然有一个问题。它添加对象,但将数据放在比我真正喜欢的位置低一级的位置。R和MongoDB:数组存储为索引作为键的对象
这里的数据是怎么来的:
prettify(jsonKill)
[
{
"id" : {
"timestamp" : 1409785080,
"machine" : 11966932,
"pid" : 3144,
"increment" : 11720074,
"creationTime" : "2014-09-03T22:58:00Z"
},
...
]
这里是我的代码,增加了它的MongoDB:
library('jsonlite')
library('rmongodb')
m <- mongo.create()
ns <- 'database.collection'
killObject <- fromJSON('http://omitted.because.nda:8000/api/omit')
x <- nrow(killObject)
for(i in 1:x){
jsonKill <- toJSON(killObject[i:i,])
bson <- mongo.bson.from.JSON(jsonKill)
mongo.insert(m, ns, bson)
paste("Inserting Record: ", i)
}
cursor <- mongo.find(m, ns, bson)
while(mongo.cursor.next(cursor)){
value <- mongo.cursor.value(cursor)
list <- mongo.bson.to.list(value)
str(list)
}
下面是结果:
{
"_id" : ObjectId("54081299d5ec83d046d05766"),
"1" : {
"id" : {
"timestamp" : 1409756219,
"machine" : 2364985,
"pid" : 9076,
"increment" : 1079972,
"creationTime" : "2014-09-03T14:56:59Z"
},
...
}
我'm的目标是做db.collection.find({"id.pid" : $gt1})
或与mongo.index.create(m, ns, {"id.pid"}, mongo.index.unique)
索引的东西,不是必需的只有id
键,但一个或多个键不显示在此处。
答
原因是rmongodb当前有一个会阻碍数组使用的bug。
R:
library(rmongodb)
m <- mongo.create()
json <- '{"array":[{"a":1},{"b":2}]}'
bson <- mongo.bson.from.JSON(json)
mongo.insert(m, "database.collection", bson)
MongoDB的壳:
> db.collection.find().pretty()
{
"_id" : ObjectId("540825d68a271f234b6d62d2"),
"array" : {
"1" : {
"a" : 1
},
"2" : {
"b" : 2
}
}
}
为此目的我开发的软件包(rmongodbHelper),提供了一个解决方法这一问题:
R:
library(devtools)
install_github("joyofdata/rmongodbHelper")
library(rmongodbHelper)
json <- '{"array":[{"a":1},{"b":2}]}'
bson <- rmongodbHelper::json_to_bson(json)
mongo.insert(m, "database.collection", bson)
MongoDB的外壳:
> db.collection.find().pretty()
{
"_id" : ObjectId("540826738a271f234b6d62d4"),
"array" : [
{
"a" : 1
},
{
"b" : 2
}
]
}
你可以找到这个包,并使用MongoDB的与我的网站 - [R的详细信息:
请记住,MongoDB不能存储裸数组 - 只有对象 - 它们本身可能包含数组。
有可能服务返回一个json文档而不是一个对象的数组?它有多个ID字段?请提供完整的答复,只留下实际上多余的部分。 – Raffael 2014-09-04 08:22:24
服务返回一个对象数组。以前,当我插入对象时,整个对象将作为一个大对象进入。我只是想找到一些我不需要用'“。#.key.key”'引用的对象。这是通过我的for循环修复的,将它分开,并逐个插入每个对象和所有的子项,但是我仍然遇到了这个#字段阻碍了我的查询/创建的问题。 – user1059110 2014-09-04 08:42:18