2015-12-24 2 views
0

Вопросг mongolite - дата запроса

Использование 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) 

Монго запрос оболочки

Чтобы найти записи после указанной даты я хотел бы использовать

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

Как я могу воспроизвести этот запрос в R с помощью mongolite?

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")}} 

ответ

5

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

Потому что as.integer (as.POSIXct (« 2017-06-08 », tz =« GMT », origin =« 1970-01-01 »)) * 1000 возвращает 1.49688 e + 12, я предлагаю вставить «000» вместо умножения на 1000. –

4

ответ попробовать mattjmorris от GitHub

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

+1

Какая функция 'qq'? – tospig

+0

это функция из пакета 'GetoptLong' – user2754799

Смежные вопросы