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_ids。

在 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_ids 的,其中所有星期一、星期二、星期三、星期四、星期五 = 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 查询构造的主要内容,如果未能解决你的问题,请参考以下文章

使用 rmongodb 在 R 中运行高级 MongoDB 查询

使用包 'rmongodb' 处理查询结果集

rmongodb: $exists 给出空结果

rmongodb 没有为键返回不同的值

使用正则表达式的 Rmongodb 无法按预期工作

R:“$addToSet”中的字段“$addToSet”对于存储无效:rmongodb