将gte投影选项用于Mongodb shell上的ISODate对象时出错
我有一个以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-
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()的输出,以便我们可以验证字段的实际内容吗?