r - rmongodb $or 查询构造
Posted
技术标签:
【中文标题】r - rmongodb $or 查询构造【英文标题】:r - rmongodb $or query construction 【发布时间】:2015-07-18 12:33:35 【问题描述】:背景
我有 GTFS 数据存储在本地 mongodb 数据库中。
calendar
表看起来像
field | type
service_id | varchar
monday | int (0 or 1)
tuesday | int (0 or 1)
...
sunday | int (0 or 1)
任务
我想使用r
中的rmongodb
包来选择任何工作日(周一至周五)= 1 的所有service_id
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
子句,而不是 OR
。
尝试 3:
## 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
我在 R
中的查询尝试出了什么问题,导致我无法获得与使用 Robomongo GUI 时相同的 8 个文档?
【问题讨论】:
尝试 0 未传递 json。尝试将您的ls
包裹在 toJSON(ls)
中。
@BrandonBertelsen ?mongo.find.all
- query
参数接受一个列表。事实证明,我也需要将每个 or
条件放在自己的列表中(请参阅我的答案)
这很棘手,我自己也遇到过问题,但更多的是发布数据而不是检索数据。
【参考方案1】:
我的“尝试 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
【讨论】:
看来你自己回答了,所以请关闭问题。 @DmitriySelivanov 我必须再等 6 个小时才能接受我自己的答案;)以上是关于r - rmongodb $or 查询构造的主要内容,如果未能解决你的问题,请参考以下文章