0

我正在尝试根据时间戳查询 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 它也不起作用。日期格式是否错误?还是查询错误?

4

3 回答 3

2

您可以使用mongo.bson.buffer.append.timewithstrptime("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)  
于 2013-10-26T04:12:46.960 回答
1

看起来 rmongodb 已经对此问题进行了更新。从rmongodb 网站

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为使其适用于我的数据。

于 2014-12-16T22:20:39.177 回答
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 & lt 都适用于“创建”,那么我认为您希望像上面那样拥有它。

于 2013-08-15T02:11:42.147 回答