如何在Mongo中编写以下SQL查询?
select * from test where date(created)=curdate()
创建的N.B是日期时间字段。
答案 0 :(得分:0)
使用MongoDB处理此问题的最佳方法是简单地使用具有外部计算日期的范围查询。因此,如果您正在使用当前日期并且想要当天的所有项目:
var start = new Date();
start = new Date( start.valueOf() - start.valueOf() % ( 1000 * 60 * 60 * 24 ) );
end = new Date( start.valueOf() + ( 1000 * 60 * 60 * 24 ) );
db.collection.find({ "created": { "$gte": start, "$lt": end } });
因此,$gte
和$lt
运算符会根据您计算或提供的值定义要搜索的日期范围。对于其他语言来说,这种方法是相同的,这些语言都有一个日期对象" type"序列化到您的驱动程序所需的BSON。查看驱动程序文档以获取详细信息。
您可以使用评估JavaScript的$where
运算符来执行该查询,但不建议这样做。原因在于"范围"已经给出的表单可以使用索引来减少扫描的项目,而JavaScript评估则不能:
db.collection.find(function() {
var today = new Date();
today = new Date( today.valueOf() - today.valueOf() % ( 1000 * 60 * 60 * 24 ) );
return (
( this.created.valueOf() - this.created.valueOf() % ( 1000 * 60 * 60 * 24 ) )
== today.valueOf()
);
})
这基本上等同于SQL语句,但它不如第一种形式有效,因为索引不能用于评估。 SQL也是如此。
因此,请使用范围查询版本,因为它更好,并尝试尽可能避免JavaScript评估。
您可以在手册中找到有关MongoDB术语中常见SQL语句的更多信息: