0

我正在尝试通过 R 驱动程序 rmongodb 查询 MongoDB。以下查询适用于 cmd 行(结果:204,915):

db.col1.count( 
    {
        $or: [
            {'status.time':{$gt: ISODate('2013-09-10 00:00:00')}},
            {'editings.time':{$gt: ISODate('2013-09-10 00:00:00')}}
        ]
    } );

把它翻译成R,我试过:

d<-strptime('2013-09-10', format='%Y-%m-%d')
buf <- mongo.bson.buffer.create()
mongo.bson.buffer.start.array(buf, "$or")
mongo.bson.buffer.start.object(buf, 'status.time')
mongo.bson.buffer.append(buf, "$gt", d)
mongo.bson.buffer.finish.object(buf)
mongo.bson.buffer.start.object(buf, 'editings.time')
mongo.bson.buffer.append(buf, "$gt", d)        
mongo.bson.buffer.finish.object(buf)

编辑:这是查询在 R 中打印的内容:

>mongo.bson.from.buffer(buf)
    $or : 4      
        status.time : 3      
            $gt : 9      79497984

        editings.time : 3    
            $gt : 9      79497984

使用...执行查询

mongo.count(mongo, db1.col1, query=mongo.bson.from.buffer(buf))

...给我“-1”。我尝试了 BSON 的几种变体,结果都一样。但是,仅使用其中一个条件(没有 $or 数组)是可行的。有人看到我的错误吗?

顺便说一句:我知道线程rmongodb: using $or in query,但是,使用替代驱动程序 RMongo 的建议答案不满足我的代码的其他要求。

4

2 回答 2

0

您创建 mongo bson 数组的方式是错误的。你缺少零件

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

我希望这暂时有效。我正在研究一个更简单的解决方案!

于 2013-11-22T19:02:22.090 回答
0

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

首先让我们设置环境:

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":"__int(0)", "dates":{}}',
  '{"_id":"__int(1)", "dates":{"a":"__time(2013-01-01)", "b":"__time(2013-01-01)"}}',
  '{"_id":"__int(2)", "dates":{"a":"__time(2013-01-01)", "b":"__time(2014-01-01)"}}',
  '{"_id":"__int(3)", "dates":{"a":"__time(2014-01-01)", "b":"__time(2013-01-01)"}}',
  '{"_id":"__int(4)", "dates":{"a":"__time(2014-01-01)", "b":"__time(2014-01-01)"}}'
)

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

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

> use dbx
switched to db dbx
> db.collx.find().pretty()
{ "_id" : 0, "dates" : { } }
{
        "_id" : 1,
        "dates" : {
                "a" : ISODate("2013-01-01T00:00:00Z"),
                "b" : ISODate("2013-01-01T00:00:00Z")
        }
}
[...]
{
        "_id" : 4,
        "dates" : {
                "a" : ISODate("2014-01-01T00:00:00Z"),
                "b" : ISODate("2014-01-01T00:00:00Z")
        }
}

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

# searching for those objects
# JSON keys currently are expected to be wrapped in double quotes!

json_qry <- 
'{
  "$or": [
    {"dates.a":{"$gt": "__time(2013-06-10)"}},
    {"dates.b":{"$gt": "__time(2013-06-10)"}}
  ]
}'

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

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

这就是我们最终得到的:

_id : 16     2
dates : 3    
    a : 9    -211265536
    b : 9    1259963392

_id : 16     3
dates : 3    
    a : 9    1259963392
    b : 9    -211265536

_id : 16     4
dates : 3    
    a : 9    1259963392
    b : 9    1259963392

  • 键 - 也像 $or 这样的运算符 - 需要放在双引号中。
  • "x":3将导致 3 被转换为 double
  • "x":"__int(3)"将导致 3 被转换为整数
于 2014-08-24T16:26:58.870 回答