1

我有一个以 ISODate 格式存储的时间戳字段的集合。该数据库由第三方填充。文档的一个子集如下所示:

collection{
    "_id" : "foobar/201310",
    "name" : "SomeName",
    "processedtime" : "2013-10-01T00:00:00.000Z",
    "value" : 375439
       .
       .
       .
}

processedtime字段中的数据看起来像2014-10-21T12:13:12.056790

当我使用以下查询查询此集合时:

db.collection.find({},{processedtime:{$gte : ISODate("2014-10-21T00:00:00.000Z")}});

我收到此错误:

不支持的投影选项 "$gte", "code":13097";

当我ISODate将查询中的更改为“新日期”或更改$gte$gt

我正在使用版本2.4.6,我的查询是否存在一些配置或语法问题?我也想知道,因为数据会达到纳秒,这是一个问题吗?我一直在寻找这个错误,似乎没有人用这样的查询报告它。

4

2 回答 2

2

首先,您的查询条件(例如$gte条件)进入查找的第一个文档,而不是第二个文档 - 这就是您收到投影错误的原因 - 您是说返回所有文档(空标准字段 - {})然后有在第二个领域中的一个基本无意义的预测。基本上,您的查询应如下所示:

db.collection.find({processedtime:{$gte : ISODate("2014-10-21T00:00:00.000Z")}});

如果您只想返回特定字段,例如nameand processedtime,您可以像这样添加一个投影。现在您可以看到为什么原始查询没有真正意义并引发错误:

db.collection.find({processedtime:{$gte : ISODate("2014-10-21T00:00:00.000Z")}}, {_id : 0, name : 1, processedtime : 1});

您的示例文档表明该processedtime字段实际上并未存储为ISODate,而是似乎存储为字符串。这意味着您的查询应该是:

db.collection.find({processedtime:{$gte : "2014-10-21T00:00:00.000Z"}});

应该注意的是,这会使比较有点棘手,因为它将使用字典顺序来比较字符串值,这可能会导致奇怪的结果,但对于您的目的来说可能没问题。

为了解释您缺少结果,在BSON 规范中,字符串类型位于 UTC 日期时间类型之前,这意味着如果您查找“大于”UTC datetime值的字符串,您将始终一无所获。

此外,如果您有一个索引processedtime并运行查询以查找特定数据类型 ( ISODate),那么它将只返回该类型的结果。因此,如果processedtime确实存储为字符串,那么无论由于类型不匹配而使用的条件如何,该查询也将一无所获。

于 2014-10-23T13:49:05.740 回答
1

db.collection.find({},{processedtime:{$gte : ISODate("2014-10-21T00:00:00.000Z")}});应该是db.collection.find({processedtime:{$gte : "2014-10-21T00:00:00.000Z"}});

于 2014-10-23T13:24:21.720 回答