首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >rmongodb:在查询中使用$or

rmongodb:在查询中使用$or
EN

Stack Overflow用户
提问于 2012-08-22 13:51:34
回答 4查看 1.4K关注 0票数 2

我正在努力在R和rmongodb中使用$or创建一个查询。我想要模拟的是来自cmdline mongo的:

代码语言:javascript
复制
db.people.find( { $or : [ {"person.cell": { $exists : true } }, {"person.home": { $exists : true } } ] })

我想拉取person.cell不为空或person.home不为空的记录。我可以单独查询每一个,但是当我使用$or在rmongodb中创建缓冲区时,无法获得数据,使用rmongodb的R代码如下所示:

代码语言:javascript
复制
l <- list("$exists"="true")
buf <- mongo.bson.buffer.create()
mongo.bson.buffer.start.array(buf, "$or")
mongo.bson.buffer.append.list(buf, "person.cell", l)
mongo.bson.buffer.append.list(buf, "person.home", l)
mongo.bson.buffer.finish.object(buf)  
b <- mongo.bson.from.buffer(buf)
mongo.find(mongo, "work.people", b)

这不会返回任何记录,也不会返回错误,只会返回一个空集。正如我所提到的,我可以在person.cell或person.home上进行查找并获得结果,但当我尝试执行$or (在rmongodb中)以便使用person.cell或person.home拉取记录时就不能了。

我也尝试过这个:

代码语言:javascript
复制
buf <- mongo.bson.buffer.create()
mongo.bson.buffer.start.array(buf, "$or")
mongo.bson.buffer.start.object(buf, "person.cell")
mongo.bson.buffer.append(buf, "$exists", "true")
mongo.bson.buffer.finish.object(buf)
mongo.bson.buffer.start.object(buf, "person.home")
mongo.bson.buffer.append(buf, "$exists", "true")
mongo.bson.buffer.finish.object(buf)
mongo.bson.buffer.finish.object(buf)
b <- mongo.bson.from.buffer(buf)
mongo.find(mongo, "work.people", b)

但是我得到了相同的空集结果(当我查看它时,"b“看起来是一样的)。我被困在这个问题上了。

EN

回答 4

Stack Overflow用户

发布于 2013-11-23 03:05:41

你创建mongo bson数组的方式是错误的。你遗漏了部分

代码语言:javascript
复制
mongo.bson.buffer.start.object(buf, "0")
...
mongo.bson.buffer.finish.object(buf)
mongo.bson.buffer.start.object(buf, "1")
...
mongo.bson.buffer.finish.object(buf)

有关工作示例,请查看最新评论:https://github.com/mongosoup/rmongodb/issues/17

我希望这在目前是可行的。

所有.to.list / .from.list / .append.list命令中都存在错误。我正在研究一个更简单的解决方案!

票数 1
EN

Stack Overflow用户

发布于 2014-01-22 09:43:17

代码语言:javascript
复制
bson <- mongo.bson.from.JSON('{ "$or" : [ {"person.cell": { "$exists" : true } }, {"person.home": { "$exists" : true } } ] }')
mongo.find(mongo, "work.people", bson)
票数 1
EN

Stack Overflow用户

发布于 2014-08-24 23:06:01

为了避免编写mongo.bson.buffer语句序列,我编写了一个包(rmongodbHelper),它将JSON或list()转换为BSON对象,然后可以与rmongodb一起使用。

首先,让我们设置一下环境:

代码语言:javascript
复制
library(rmongodb)

# install rmongodbHelper package from GitHub

library(devtools)
devtools::install_github("joyofdata/rmongodbHelper")
library(rmongodbHelper)

# the MongoDB instance

ns <- "dbx.collx"
M <- mongo.create()
mongo.is.connected(M)
mongo.remove(M, ns, json_to_bson("{}"))

# inserting a number of dummy objects
# JSON keys currently are expected to be wrapped in double quotes!

objs <- c(
  '{"_id":-1}',
  '{"_id":-2, "person":{}}',
  '{"_id":-3, "person":{"x":0}}',
  '{"_id":1,  "person":{"cell":0}}',
  '{"_id":2,  "person":{"home":0}}',
  '{"_id":3,  "person":{"cell":0,"home":0}}'
)

for(obj in objs) {
  mongo.insert(M, ns, json_to_bson(obj))
}

让我们通过MongoDB shell查看它们是否成功插入:

代码语言:javascript
复制
> use dbx
switched to db dbx
> db.collx.find().pretty()
{ "_id" : -1 }
{ "_id" : -2, "person" : { } }
{ "_id" : -3, "person" : { "x" : 0 } }
{ "_id" : 1, "person" : { "cell" : 0 } }
{ "_id" : 2, "person" : { "home" : 0 } }
{ "_id" : 3, "person" : { "cell" : 0, "home" : 0 } }

现在让我们使用一个查询来搜索文档:

代码语言:javascript
复制
# searching for those objects
# JSON keys currently are expected to be wrapped in double quotes!

json_qry <- 
'{
  "$or" : [ 
    {"person.cell": { "$exists" : true } }, 
    {"person.home": { "$exists" : true } } 
  ] 
}'

cur <- mongo.find(M, "dbx.collx", json_to_bson(json_qry))

while(mongo.cursor.next(cur)) {
    print(mongo.cursor.value(cur))
}

这是我们最终得到的结果:

代码语言:javascript
复制
_id : 1      1.000000
person : 3   
    cell : 1     0.000000

_id : 1      2.000000
person : 3   
    home : 1     0.000000

_id : 1      3.000000
person : 3   
    cell : 1     0.000000
    home : 1     0.000000
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12067020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档