[英]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.