簡體   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