如何在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/

10-12 22:26