将gte投影选项用于Mongodb shell上的ISODate对象时出错

将gte投影选项用于Mongodb shell上的ISODate对象时出错,mongodb,isodate,Mongodb,Isodate,我有一个以ISODate格式存储的带有时间戳字段的集合。此数据库由第三方填充。文档的一个子集如下所示: collection{ "_id" : "foobar/201310", "name" : "SomeName", "processedtime" : "2013-10-01T00:00:00.000Z", "value" : 375439 . . . } processedtime字段中的数据看起来像2014-10-

我有一个以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”,“代码”:13097”

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


我正在使用版本
2.4.6
,我的查询是否存在一些配置块或语法问题?我还想知道,由于数据输出到纳秒,这是一个问题吗?我已经查找了这个错误,似乎没有人用这样的查询报告它。

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

首先,您的查询条件(例如
$gte
条件)进入查找的第一个文档,而不是第二个文档-这就是为什么会出现投影错误-您说的是返回所有文档(空的条件字段-
{}
),然后在第二个字段中有一个基本上无意义的投影。基本上,您的查询应该如下所示:

db.collection.find({processedtime:{$gte : ISODate("2014-10-21T00:00:00.000Z")}});
如果您只想返回特定字段,例如
name
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"}});
应该注意的是,这将使比较变得有点棘手,因为它将用于比较字符串值,这可能会导致奇怪的结果,但出于您的目的,这可能是正常的

为了解释缺少结果的原因,字符串类型位于中的UTC日期时间类型之前,这意味着如果查找“大于”
UTC日期时间值的字符串,则始终不会得到任何结果


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

当我使用此格式时,我根本没有得到任何结果,尽管应该有数百个集合与搜索条件匹配。@Kirt霍尔,数据库中processedtime的数据类型是什么,字符串还是日期?如果是日期,请使用
db.collection.find({processedtime:{$gte:ISODate(“2014-10-21T00:00:00.000Z”)});
。但根据您问题的输出,它是字符串类型:
“processedtime”:“2013-10-01T00:00:00.000Z”“,
我再次尝试了这一点,按照您的回答删除了ISODate构造函数,并且成功了。正如Adam指出的,数据不是作为ISODate对象存储的,而是作为字符串存储的。我将不得不在我的代码中按字典顺序进行排序。谢谢你的回复!更正一下,我的查询中的字段仅为微秒,数据集中的其他一些字段为纳秒,但不是我在这里使用的示例。看起来您的日期是根据您的输出存储为字符串的,但从示例中看不太清楚。您可以发布db.collection.findOne()的输出,以便我们可以验证字段的实际内容吗?