背景
我有GTFS个数据存储在本地mongodb数据库中。
calendar
表格如
field | type
service_id | varchar
monday | int (0 or 1)
tuesday | int (0 or 1)
...
sunday | int (0 or 1)
任务
我想使用service_id
中的rmongodb
包选择任何工作日(周一至周五)= 1的所有r
s。
在SQL中,这可能是:SELECT service_id FROM calendar WHERE monday = 1 OR tuesday = 1 OR ... OR friday = 1
详细
使用Robomongo GUI时,查询为:
db.getCollection('calendar').find({"$or" :
[{'monday':1},
{'tuesday':1},
{'wednesday':1},
{'thursday':1},
{'friday':1}]
})
返回8个文件(见图)
因此,在r
中我试图构建相同的or
查询,返回相同的结果,但我没有运气。
library(rmongodb)
library(jsonlite)
## connect to db
mongo <- mongo.create()
mongo.is.connected(mongo)
db <- "temp"
## days for which I want a service:
serviceDays <- c("monday","tuesday","wednesday","thursday","friday")
尝试0:
## create list as the 'query' condition
ls <- list("$or" =
list("monday" = 1L,
"tuesday" = 1L,
"wednesday" = 1L,
"thursday" = 1L,
"friday" = 1L))
services <- mongo.find.all(mongo, "temp.calendar", query=ls)
## returns error:
Error in mongo.find(mongo, ns, query = query, sort = sort, fields = fields, :
find failed with unknown error.
尝试1:
## paste the string together
js <- paste0('{"', serviceDays, '":[',1L,']}', collapse=",")
js <- paste0('{"$or" :[', js, ']}')
## this string has been validated at jsonlint.com
bs <- mongo.bson.from.JSON(js)
## run query
services <- mongo.find.all(mongo, "temp.calendar", query=bs)
## result
> services
list() ## empty list
## manually writing the JSON string doesn't work either
# js <- '{"$or" : [{"monday":[1]},{"tuesday":[1]},{"wednesday":[1]},{"thursday":[1]},{"friday":[1]}]}'
尝试2:
## create the or condition using R code
l <- as.list(sapply(serviceDays, function(y) 1L))
bs <- mongo.bson.from.list(list("$or" = list(l)))
## run query
services <- mongo.find.all(mongo, "temp.calendar", query=bs)
## result
> length(services)
[1] 2 ## 2 documents returned
返回的两个文件是service_id
s所有星期一,星期二,星期三,星期四,星期五= 1.即,它似乎使用了AND
条款,而不是{{1 }}
尝试3:
OR
我## deconstruct the JSON string (attempt 1)
js <- fromJSON(js, simplifyVector=FALSE)
bs <- mongo.bson.from.list(js)
## run query
services <- mongo.find.all(mongo, "temp.calendar", query=bs)
## result
> services
list() ## empty list
中的查询尝试有什么问题导致我无法获得使用Robomongo GUI时获得的相同8个文档?
答案 0 :(得分:2)
我的'尝试0'很接近,但我错过了更多list
个参数。
ls <- list("$or" = list(list("monday" = 1L),
list("tuesday" = 1L),
list("wednesday" = 1L),
list("thursday"= 1L),
list("friday" = 1L)))
## json string:
> toJSON(ls)
{"$or":[{"monday":[1]},{"tuesday":[1]},{"wednesday":[1]},{"thursday":[1]},{"friday":[1]}]}
## run query:
services <- mongo.find.all(mongo, "temp.calendar", query=ls)
## result
length(services)
[1] 8