r-rmongodb$或查询构造

r-rmongodb$或查询构造,r,rmongodb,R,Rmongodb,背景 我将数据存储在本地mongodb数据库中 日历表看起来像 field | type service_id | varchar monday | int (0 or 1) tuesday | int (0 or 1) ... sunday | int (0 or 1) 任务 我想使用r中的rmongodb包选择所有工作日星期一到星期五=1的服务ID 在SQL中,这类似于:从日历中选择service_id,其中周一=1或周二=1或。。。或星期五=1 细部 使用

背景

我将数据存储在本地mongodb数据库中

日历表看起来像

field      | type
service_id | varchar
monday     | int (0 or 1)
tuesday    | int (0 or 1)
...
sunday     | int (0 or 1)
任务

我想使用r中的rmongodb包选择所有工作日星期一到星期五=1的服务ID

在SQL中,这类似于:从日历中选择service_id,其中周一=1或周二=1或。。。或星期五=1

细部

使用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")

在R中进行的查询尝试有什么问题,使我无法获得与使用Robomongo GUI时相同的8个文档?

我的“尝试0”很接近,但我缺少了更多的列表参数

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

尝试0未传递json。尝试将ls包装到toJSONls中。@BrandonBertelsen?mongo.find.all-查询参数接受列表。事实证明,我也需要将每个或条件放在自己的列表中查看我的答案这很棘手,我自己也有问题,但更多的是发布数据,而不是检索数据。似乎你自己回答了,所以请关闭问题。@DmitriySelivanov我必须再等6个小时才能接受我自己的答案;
## 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]}]}'
## 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
## 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
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