r mongolite - 日期查询
r mongolite - date query
问题
使用 R
中的 mongolite
包,如何查询给定日期的数据库?
示例数据
考虑一个包含两个条目的 test
集合
library(mongolite)
## create dummy data
df <- data.frame(id = c(1,2),
dte = as.POSIXct(c("2015-01-01","2015-01-02")))
> df
id dte
1 1 2015-01-01
2 2 2015-01-02
## insert into database
mong <- mongo(collection = "test", db = "test", url = "mongodb://localhost")
mong$insert(df)
Mongoshell查询
要查找给定日期之后的条目,我会使用
db.test.find({"dte" : {"$gt" : new ISODate("2015-01-01")}})
如何使用 mongolite
在 R
中重现此查询?
R 次尝试
到目前为止我已经试过了
qry <- paste0('{"dte" : {"$gt" : new ISODate("2015-01-01")}}')
mong$find(qry)
Error: Invalid JSON object: {"dte" : {"$gt" : new ISODate("2015-01-01")}}
qry <- paste0('{"dte" : {"$gt" : "2015-01-01"}}')
mong$find(qry)
Imported 0 records. Simplifying into dataframe...
data frame with 0 columns and 0 rows
qry <- paste0('{"dte" : {"gt" : ', as.POSIXct("2015-01-01"), '}}')
mong$find(qry)
Error: Invalid JSON object: {"dte" : {"gt" : 2015-01-01}}
qry <- paste0('{"dte" : {"gt" : new ISODate("', as.POSIXct("2015-01-01"), '")}}')
mong$find(qry)
Error: Invalid JSON object: {"dte" : {"gt" : new ISODate("2015-01-01")}}
尝试来自 github
的 mattjmorris 的回答
library(GetoptLong)
datemillis <- as.integer(as.POSIXct("2015-01-01")) * 1000
data <- data_collection$find(qq('{"createdAt":{"$gt": { "$date" : { "$numberLong" : "@{datemillis}" } } } }'))
参考:https://github.com/jeroenooms/mongolite/issues/5#issuecomment-160996514
@user2754799 有正确的方法,但我做了一些小改动,以便它回答我的问题。如果他们想用这个解决方案编辑他们的答案,我会接受。
d <- as.integer(as.POSIXct(strptime("2015-01-01","%Y-%m-%d"))) * 1000
## or more concisely
## d <- as.integer(as.POSIXct("2015-01-01")) * 1000
data <- mong$find(paste0('{"dte":{"$gt": { "$date" : { "$numberLong" : "', d, '" } } } }'))
通过将日期乘以 1000 来转换日期之前,请执行以下操作:options(scipen=1000)
,因为缺少此解决方法会影响某些日期。
这个解释:
当我再次忘记如何在 mongolite
中查询日期并且懒得去找文档时,这个问题一直出现在我的 google 结果的顶部:
以上Mongodbshell查询,
db.test.find({"dte" : {"$gt" : new ISODate("2015-01-01")}})
现在翻译成
mong$find('{"dte":{"$gt":{"$date":"2015-01-01T00:00:00Z"}}}')
可选地,您可以添加毫秒:
mong$find('{"dte":{"$gt":{"$date":"2015-01-01T00:00:00.000Z"}}}')
如果您使用了错误的日期时间格式,您会收到一条有用的错误消息,为您指明正确的格式:use ISO8601 format yyyy-mm-ddThh:mm plus timezone, either "Z" or like "+0500"
当然,这也记录在the mongolite manual
问题
使用 R
中的 mongolite
包,如何查询给定日期的数据库?
示例数据
考虑一个包含两个条目的 test
集合
library(mongolite)
## create dummy data
df <- data.frame(id = c(1,2),
dte = as.POSIXct(c("2015-01-01","2015-01-02")))
> df
id dte
1 1 2015-01-01
2 2 2015-01-02
## insert into database
mong <- mongo(collection = "test", db = "test", url = "mongodb://localhost")
mong$insert(df)
Mongoshell查询
要查找给定日期之后的条目,我会使用
db.test.find({"dte" : {"$gt" : new ISODate("2015-01-01")}})
如何使用 mongolite
在 R
中重现此查询?
R 次尝试
到目前为止我已经试过了
qry <- paste0('{"dte" : {"$gt" : new ISODate("2015-01-01")}}')
mong$find(qry)
Error: Invalid JSON object: {"dte" : {"$gt" : new ISODate("2015-01-01")}}
qry <- paste0('{"dte" : {"$gt" : "2015-01-01"}}')
mong$find(qry)
Imported 0 records. Simplifying into dataframe...
data frame with 0 columns and 0 rows
qry <- paste0('{"dte" : {"gt" : ', as.POSIXct("2015-01-01"), '}}')
mong$find(qry)
Error: Invalid JSON object: {"dte" : {"gt" : 2015-01-01}}
qry <- paste0('{"dte" : {"gt" : new ISODate("', as.POSIXct("2015-01-01"), '")}}')
mong$find(qry)
Error: Invalid JSON object: {"dte" : {"gt" : new ISODate("2015-01-01")}}
尝试来自 github
的 mattjmorris 的回答library(GetoptLong)
datemillis <- as.integer(as.POSIXct("2015-01-01")) * 1000
data <- data_collection$find(qq('{"createdAt":{"$gt": { "$date" : { "$numberLong" : "@{datemillis}" } } } }'))
参考:https://github.com/jeroenooms/mongolite/issues/5#issuecomment-160996514
@user2754799 有正确的方法,但我做了一些小改动,以便它回答我的问题。如果他们想用这个解决方案编辑他们的答案,我会接受。
d <- as.integer(as.POSIXct(strptime("2015-01-01","%Y-%m-%d"))) * 1000
## or more concisely
## d <- as.integer(as.POSIXct("2015-01-01")) * 1000
data <- mong$find(paste0('{"dte":{"$gt": { "$date" : { "$numberLong" : "', d, '" } } } }'))
通过将日期乘以 1000 来转换日期之前,请执行以下操作:options(scipen=1000)
,因为缺少此解决方法会影响某些日期。
这个解释
当我再次忘记如何在 mongolite
中查询日期并且懒得去找文档时,这个问题一直出现在我的 google 结果的顶部:
以上Mongodbshell查询,
db.test.find({"dte" : {"$gt" : new ISODate("2015-01-01")}})
现在翻译成
mong$find('{"dte":{"$gt":{"$date":"2015-01-01T00:00:00Z"}}}')
可选地,您可以添加毫秒:
mong$find('{"dte":{"$gt":{"$date":"2015-01-01T00:00:00.000Z"}}}')
如果您使用了错误的日期时间格式,您会收到一条有用的错误消息,为您指明正确的格式:use ISO8601 format yyyy-mm-ddThh:mm plus timezone, either "Z" or like "+0500"
当然,这也记录在the mongolite manual