簡體   English   中英

在MongoDB中使用$ lt和$ gt過濾日期值

[英]Filtering Date Values Using $lt and $gt in MongoDB

在我的MongoDB / Node后端中,我正在設置一個函數,該函數接受用戶輸入的過濾器值並通過GET請求相應地過濾數據。 這在大多數情況下都是有效的。 大多數過濾器都按預期返回記錄。

但是,事實證明過濾出生日期(出生日期)是有問題的。 具體來說,當同時獲取dobBefore和dobAfter的值時,結果將不正確。 我看不到根據看到的記錄返回的日期范圍。

對於我的過濾器代碼,如果有輸入值,我首先將其轉換為日期(以與我們的數據庫值匹配-即日期),然后運行搜索以僅返回dob所在的記錄(在這種情況下) dobBefore的值-輸入的日期值之前的日期(使用$ lt運算符),對於dobAfter的情況-輸入的日期值之后的日期(使用$ gt運算符)。 這是有問題的代碼:

  // dobBefore filter
  if (dobBefore) {
    let dobBeforeDate = new Date(dobBefore);
    console.log('dobBeforeDate: ', dobBeforeDate);
        search['dob'] = { $lt: dobBeforeDate };
  }

  // dobAfter filter
  if (dobAfter) {
    let dobAfterDate = new Date(dobAfter);
    console.log('dobAfterDate: ', dobAfterDate);
        search['dob'] = { $gt: dobAfterDate };
  }

完整的GET請求如下所示:

api.somesite.com/v0/customers/details?dobBefore=1998-12-06&dobAfter=1998-02-06&apikey=1d1d1d1&token=ffb4bbb3

就像我之前說的,雖然我只能看到dob在1998-12-06之前和1998-02-06之后(因此在10個月的范圍內)的記錄,但是我看不到返回記錄中的反映。 例如,這是從上面的查詢返回的記錄之一(明顯超出目標范圍):

"dob": "2007-08-23T05:00:00.000Z"

為了澄清,在文檔中,dob像這樣存儲,並且類型為“ date”:

1998-12-01T06:00:00.000Z

這里有一些日期和$ lt和$ gt運算符的陷阱嗎? 還是我還缺少其他東西?

編輯/ UPDATE:

從@Veeram獲得一些反饋后,我意識到我正在覆蓋另一個查詢。 我需要將它們結合起來。 我在想這樣的事情應該起作用(順便說一句,如果沒有值,我將dobBefore和dobAfter初始化為空字符串,這就是為什么我要檢查空字符串的原因):

let search = {};

// dobBefore filter
if (dobBefore && dobAfter === '') {
   let dobBeforeDate = new Date(dobBefore);
   search['dob'] = { $lt: dobBeforeDate };
}

// dobAfter filter
if (dobAfter && dobBefore === '') {
   let dobAfterDate = new Date(dobAfter);
   search['dob'] = { $gt: dobAfterDate };
}

// filter both at once
if (dobBefore && dobAfter) {
   let dobBeforeDate = new Date(dobBefore);
   let dobAfterDate = new Date(dobAfter);
   search['dob'] = { "$lt" : dobBeforeDate , "$gt" : dobAfterDate };
}

編輯/更新2:此處上面的代碼按預期工作。 問題解決了!

您正在用$ gt值覆蓋dob密鑰。

你要

{"dob" :{
   "$lt" : ISODate("2018-03-16T19:31:01.229Z"),
   "$gt" : ISODate("2018-03-25T19:31:01.279Z")
}}

嘗試

let search = {dob:{}};
if (dobBefore) {
    let dobBeforeDate = new Date(dobBefore);
    console.log('dobBeforeDate: ', dobBeforeDate);
    search['dob'].$lt =  dobBeforeDate;
  }

  // dobAfter filter
if (dobAfter) {
    let dobAfterDate = new Date(dobAfter);
    console.log('dobAfterDate: ', dobAfterDate);
    search['dob'].$gt=  dobAfterDate ;
}

collection.find(search)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM