如何在Mongo中编写以下SQL查询?
select * from test where date(created)=curdate()
创建的N.B是日期时间字段。
最佳答案
使用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
运算符定义了要从您计算或提供的值中搜索的日期范围。其他语言的处理方法相同,所有语言都具有日期对象“类型”,该对象会序列化为驱动程序所需的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语句的更多信息:
SQL to MongoDB Mapping Chart
SQL to Aggregation Mapping Chart
关于mysql - 等效于mongo中的mysql date函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24373629/