通过时间戳查询mongo与rmongodb

时间:2013-08-14 19:02:44

标签: r mongodb rmongodb

我试图根据时间戳查询mongodb,但我似乎总是得到一个空列表。我必须格式化错误。对于下面的mongo文档:

{
"_id" : ObjectId("21def16043fe370208f857c2"),
"username" : "user",
"domain" : "domain.com",
"hash" : "65fdacac5ff9e",
"created" : ISODate("2012-11-20T16:08:28Z"),
"ip" : "160.85.11.222",
"actions" :
...
}

我想按创建的字段过滤文档。但是,当我尝试使用时:

mongo <- mongo.create()
buf <- mongo.bson.buffer.create()
mongo.bson.buffer.start.object(buf, "created")
mongo.bson.buffer.append(buf, "$gt", "2013-01-01")
mongo.bson.buffer.finish.object(buf)
mongo.bson.buffer.append(buf, "$lt", "2013-08-01")
mongo.bson.buffer.finish.object(buf)
query <- mongo.bson.from.buffer(buf)
cursor <- mongo.find(mongo, "domain.actions", query)  

我得到一个空列表。当我只使用$ gt或$ lt时它也不起作用。日期格式错误了吗?或者查询错了?

3 个答案:

答案 0 :(得分:2)

您可以使用 mongo.bson.buffer.append.time strptime("2013-01-01","%Y-%m-%d") 代替“mongo.bson.buffer.append(buf,”$ gt“,startDate )“或”mongo.bson.buffer.append(buf,“$ gt”,as.Date(“2013-01-01”))“

mongo <- mongo.create()
buf <- mongo.bson.buffer.create()
mongo.bson.buffer.start.object(buf, "created")
mongo.bson.buffer.append.time(buf, "$gt", strptime("2013-01-01","%Y-%m-%d"))
mongo.bson.buffer.finish.object(buf)
mongo.bson.buffer.append.time(buf, "$lt", strptime("2013-08-01","%Y-%m-%d"))
mongo.bson.buffer.finish.object(buf)
query <- mongo.bson.from.buffer(buf)
cursor <- mongo.find(mongo, "domain.actions", query)  

答案 1 :(得分:1)

看起来rmongodb已经对此问题进行了更新。来自rmongodb website

To build bson with ISODate data you should pass it as POSIXct object:

date_string <- "2014-10-11 12:01:06"
# Pay attention to timezone argument
query <- mongo.bson.from.list(list(date = as.POSIXct(date_string, tz='GMT')))
# Note, that internally MongoDB strores dates in unixtime format:
query

我将原先引用的MSK时区更改为GMT,以使其适用于我的数据。

答案 2 :(得分:0)

您需要将日期字符串转换为正确的日期,以便MongoDB可以进行比较。

尝试

mongo <- mongo.create()
buf <- mongo.bson.buffer.create()
startDate <- as.Date("2013-01-01")
endDate <- as.Date("2013-08-01")
mongo.bson.buffer.start.object(buf, "created")
mongo.bson.buffer.append(buf, "$gt", startDate)
mongo.bson.buffer.append(buf, "$lt", endDate)
mongo.bson.buffer.finish.object(buf)
query <- mongo.bson.from.buffer(buf)
cursor <- mongo.find(mongo, "domain.actions", query)  

请注意,日期字符串采用R的默认格式。如果您更改它们,则必须向as.Date提供格式字符串。

我不太熟悉R MongoDB驱动程序,但您可能还需要删除第一个finish.object。既然你想要gt&amp;这两个都适用于“创建”然后我想你想要它如上所述。