繁体   English   中英

Mongodb选择大于日期的文档

[英]Mongodb selecting documents greater than a date

我很难找回我想要的文档和子文档。 给定以下示例,我希望在某日期大于2018-07-09的情况下返回MyArray.data。 我已经看到了许多示例,但似乎没有一个适合我。 我们正在使用v3.4。

我试过了

db.getCollection('TestCol').find({"MyArray.data.somedate": {"$gt": Date("2018-07-09")}}) 

但是什么也没返回。

这是我正在测试的文档

{
"_id" : ObjectId("5b46770ca6476fde4407a8df"),
"MyArray" : [ 
    {
        "data" : {
            "somedate" : "2018-07-10 16:34"
        }
    }, 
    {
        "data" : {
            "somedate" : "2018-07-09 15:01"
        }
    }
  ]
}

我还尝试了更新

db.getCollection('TestCol').aggregate([{$match: {"MyArray.data.somedate": {"$gte": Date("2018-07-09")}}}])

您的文档不包含日期对象,而是包含一个字符串。 并且该字符串未格式化为正确的ISODate字符串或其他字符串。 您需要将传递给Mongo查询的日期转换为与数据库中字段相同的格式,以匹配日期。

为了进行转换,您可以使用date-fns格式函数,如下所示:

const format = require("date-fns/format")
const dateForQuery = format(new Date("2018-07-09"), 'YYYY-MM-DD HH:mm')
const data = await db.collection.find({"MyArray.data.somedate": {"$gt": dateForQuery}})

另一方面,您在代码中有一些不好的做法:

  1. 应该保存日期作为DB串。 您应该将Date实例直接保存到Mongo中( 请参阅此答案 )。
  2. 您创建的日期取决于您服务器的时区(我在CET中,您的示例的创建日期是“ 2018-07-09 02:00”)。 因此,您必须将时间部分传递给new Date()调用。 但是请记住,它始终在您所在的时区。 如果您始终在服务器的时区中处理时间,那么最好不要传递时间部分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM