R 和 MongoDB:数组存储为以索引为键的对象
Posted
技术标签:
【中文标题】R 和 MongoDB:数组存储为以索引为键的对象【英文标题】:R and MongoDB: Array is stored as an object with indexes as keys 【发布时间】:2014-09-04 08:11:45 【问题描述】:我正在从提供程序中提取 JSON 数据并使用 R 将其添加到 mongodb。我计划在未来使用 R 和 Shiny 来显示数据。尽管我将数据放入 JSON 对象并将其插入 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"
,
...
我的目标是使用db.collection.find("id.pid" : $gt1)
或带有mongo.index.create(m, ns, "id.pid", mongo.index.unique)
的索引来达到这种效果,不一定是id
键,而是此处未显示的一个或多个键。
【问题讨论】:
服务是否有可能返回一个 json 文档数组而不是一个对象?它有多个 id 字段吗?请提供完整的回复,仅省略实际多余的部分。 服务返回一个对象数组。以前,当我插入对象时,整个对象将作为 1 个大对象进入。我只是想拥有我不必通过"#.key.key"
引用的单个对象。这已通过我的 for 循环进行了补救,将其拆分并单独插入每个对象及其所有子对象,但我仍然遇到该 #'d 字段妨碍我的查询/创建的问题。
【参考方案1】:
原因是 rmongodb 当前存在一个会妨碍数组使用的错误。
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 shell:
> db.collection.find().pretty()
"_id" : ObjectId("540826738a271f234b6d62d4"),
"array" : [
"a" : 1
,
"b" : 2
]
您可以在我的网站上找到有关此软件包以及将 MongoDB 与 R 结合使用的更多信息:
MongoDB - State of the R
请记住,MongoDB 不能存储裸数组——只能存储对象——它们本身可能包含数组。
【讨论】:
【参考方案2】:现在it works 开箱即用。 mongo.bson.from.list
现在可以将未命名列表转换为数组。
【讨论】:
以上是关于R 和 MongoDB:数组存储为以索引为键的对象的主要内容,如果未能解决你的问题,请参考以下文章