2014-09-04 47 views
1

我從提供程序中提取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鍵,但一個或多個鍵不顯示在此處。

+0

有可能服務返回一個json文檔而不是一個對象的數組?它有多個ID字段?請提供完整的答覆,只留下實際上多餘的部分。 – Raffael 2014-09-04 08:22:24

+0

服務返回一個對象數組。以前,當我插入對象時,整個對象將作爲一個大對象進入。我只是想找到一些我不需要用'「。#.key.key」'引用的對象。這是通過我的for循環修復的,將它分開,並逐個插入每個對象和所有的子項,但是我仍然遇到了這個#字段阻礙了我的查詢/創建的問題。 – user1059110 2014-09-04 08:42:18

回答

2

原因是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 - State of the R


請記住,MongoDB不能存儲裸數組 - 只有對象 - 它們本身可能包含數組。

2

Now it works開箱即用。 mongo.bson.from.list現在可以將未命名的列表轉換爲數組。