代码之家  ›  专栏  ›  技术社区  ›  jbassking10

Mongodb选择大于日期的文档

  •  0
  • jbassking10  · 技术社区  · 8 年前

    我很难找回我想要的文档和子文档。 给出以下示例,我希望在somedate大于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")}}}])
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   Pritilender    8 年前

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

    date-fns format function 因此:

    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. 你应该 不 see this answer ).
    2. 您的创建日期取决于服务器的时区(我在CET,您的示例的创建日期是“2018-07-09 02:00”)。所以你必须把时间部分留给你的朋友 new Date() 呼叫但请记住,它总是在你当地的时区。如果您总是在服务器的时区中处理时间,那么不传递时间部分是可以的。