r mongolite - 日期查询

问题描述 投票:1回答:3

mongolite中使用R包,如何查询给定日期的数据库?

示例数据

考虑一个带有两个条目的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)

Mongo shell查询

要在给定日期之后查找条目,我会使用

db.test.find({"dte" : {"$gt" : new ISODate("2015-01-01")}})

如何使用Rmongolite中重现此查询?

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")}}
r mongolite
3个回答
6
投票

@ 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, '" } } } }'))

4
投票

尝试来自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


0
投票

在通过将其乘以1000来转换日期之前,请执行以下操作:options(scipen=1000),因为缺少此变通办法会影响某些日期。

这是解释here

© www.soinside.com 2019 - 2024. All rights reserved.