从R在mongodb中插入json日期对象

Posted

技术标签:

【中文标题】从R在mongodb中插入json日期对象【英文标题】:Inserting json date obeject in mongodb from R 【发布时间】:2017-01-06 11:17:25 【问题描述】:

我正在尝试从预测模型中插入预测值以及 mongodb 中的时间戳

以下代码将 R 数据帧转换为 json,然后再转换为 bson。但是,当结果插入到mongodb时,时间戳不会被识别为日期对象。

mongo1 <-mongo.create(host = "localhost:27017",db = "test",username = "test",password = "test")
rev<-data.frame(ts=c("2017-01-06 05:30:00","2017-01-06 05:31:00","2017-01-06 05:32:00","2017-01-06 05:33:00","2017-01-06 05:34:00"),value=c(10,20,30,40,50))
rev$ts<-as.POSIXct(strptime(rev$ts,format = "%Y-%m-%d %H:%M:%S",tz=""))

revno<-"Revision1"

mylist <- list()
mylist[[ revno ]] <- rev
mylist["lastRevision"]<-revno

StartTime<-"2017-01-06 05:30:00"

site<-"Site1"
id <- mongo.bson.buffer.create()
mongo.bson.buffer.append(id, "site",site)
mongo.bson.buffer.append(id, "ts",as.POSIXct(strptime(StartTime,format = "%Y-%m-%d %H:%M:%S",tz="")) )
s <- mongo.bson.from.buffer(id)

rev.json<-toJSON(mylist,POSIXt=c("mongo"))
rev.bson<-mongo.bson.from.JSON(rev.json)


actPower <- mongo.bson.buffer.create()
mongo.bson.buffer.append(actPower, "_id",s)
mongo.bson.buffer.append(actPower,"activePower",rev.bson)
x <- mongo.bson.from.buffer(actPower)
x

mongo.insert(mongo1,'solarpulse.forecast',x)

实际输出:


    "_id" : 
        "site" : "site1",
        "ts" : ISODate("2017-01-06T18:30:00Z")
    ,
    "activePower" : 
        "Revision1" : [
            
                "ts" : 1483660800000,
                "value" : 10
            ,
            
                "ts" : 1483660860000,
                "value" : 20
            ,
            
                "ts" : 1483660920000,
                "value" : 30
            ,
            
                "ts" : 1483660980000,
                "value" : 40
            ,
            
                "ts" : 1483661040000,
                "value" : 50
            
        ],
        "lastRevision" : [
            "Revision1"
        ]
    

预期输出格式:

"_id" : 
        "site" : "test",
        "ts" : ISODate("2016-12-18T18:30:00Z")
    

"Revision1": [
        "ts": ISODate("2016-12-19T07:30:00Z"),
        "value": 31
    , 
        "ts": ISODate("2016-12-19T07:45:00Z"),
        "value": 52
    , 
        "ts": ISODate("2016-12-19T08:00:00Z"),
        "value": 53
    , 
        "ts": ISODate("2016-12-19T08:15:00Z"),
        "value": 30
    , 
        "ts": ISODate("2016-12-19T08:30:00Z"),
        "value": 43
    , 
        "ts": ISODate("2016-12-19T08:45:00Z"),
        "value": 31
    , 
        "ts": ISODate("2016-12-19T09:00:00Z"),
        "value": 16
    , 
        "ts": ISODate("2016-12-19T09:15:00Z"),
        "value": 39
    , 
        "ts": ISODate("2016-12-19T09:30:00Z"),
        "value": 17
    , 
        "ts": ISODate("2016-12-19T09:45:00Z"),
        "value": 45
    , 
        "ts": ISODate("2016-12-19T10:00:00Z"),
        "value": 60
    , 
        "ts": ISODate("2016-12-19T10:15:00Z"),
        "value": 39
    , 
        "ts": ISODate("2016-12-19T10:30:00Z"),
        "value": 46
    , 
        "ts": ISODate("2016-12-19T10:45:00Z"),
        "value": 57
    , 
        "ts": ISODate("2016-12-19T11:00:00Z"),
        "value": 29
    , 
        "ts": ISODate("2016-12-19T11:15:00Z"),
        "value": 7
    ]

【问题讨论】:

如果没有可重现的例子,这可能很难解开。 您应该注意library(rmongodb) 是not on CRAN and no longer supported。也许试试library(mongolite) 【参考方案1】:

您可以使用library(mongolite) 为您正确插入日期。但是,我只设法让它使用data.frames 正确插入日期。使用listsJSON 字符串无法正确插入日期。

这是一个使用data.frame 插入数据的工作示例。

library(mongolite)

m <- mongo(collection = "test_dates", db = "test", url = "mongodb://localhost")

# m$drop()

df <- data.frame(id = c("site1","site2"),
                 ts = c(Sys.time(), Sys.time()))

m$insert(df)
#Complete! Processed total of 2 rows.
#$nInserted
#[1] 2
#
#$nMatched
#[1] 0
#
#$nRemoved
#[1] 0
#
#$nUpserted
#[1] 0
#
#$writeErrors
#list()

一个潜在的(但不太理想的)解决方案可能是将您的列表强制转换为data.frame,然后将其插入。

rev<-data.frame(ts=c("2017-01-06 05:30:00","2017-01-06 05:31:00","2017-

01-06 05:32:00","2017-01-06 05:33:00","2017-01-06 05:34:00"),value=c(10,20,30,40,50))
rev$ts<-as.POSIXct(strptime(rev$ts,format = "%Y-%m-%d %H:%M:%S",tz=""))

revno<-"Revision1"

mylist <- list()
mylist[[ revno ]] <- rev
mylist["lastRevision"]<-revno

m$insert(data.frame(mylist)) 

或者,插入您的列表,然后编写一个函数以直接在 mongo 中将 ts 值转换为 ISODates()

【讨论】:

以上是关于从R在mongodb中插入json日期对象的主要内容,如果未能解决你的问题,请参考以下文章

使用 MongoDB 和 Nodejs 插入和查询日期

R 和 MongoDB:数组存储为以索引为键的对象

如何使用 Mongoose 在 MongoDB 中插入 JSON 数组

MongoDB 错误:通过 JSON 文件以 ISO 格式将日期插入 MongoDB

在NodeJS中将许多文件中的JSON对象插入MongoDB的最有效方法

如何在 MongoDB 的嵌入式数组对象中插入 json 对象?