2015-04-22 220 views
3

我正在使用node.js和monodb數據庫,我想查詢基於日期的記錄,我想忽略時間和日期只有月和年這裏會匹配我的代碼: -搜索日期並忽略mongoDB中的時間和日期node.js

collection.find({ date: { "$gte": sDate, "$lt": eDate) } }).count(function (e, c) { 
}); 

這是工作但匹配的日期和時間以及如何我只能匹配月和年?請幫我解決這個問題。

編輯: - 從收集的一些數據: -

{ 
"_id" : ObjectId("5535e76f82a964d011e34fcf"), 
"VisitorId" : "5535e72a82a964d011e34fcb",  
"date" : ISODate("2015-01-21T06:00:15.761Z"), 
} 

{ 
"_id" : ObjectId("5535e75f82a964d011e34fcf"), 
"VisitorId" : "5535e72a82a964d011e34fcb",  
"date" : ISODate("2015-04-21T06:00:15.761Z"), 
} 

我會通過兩個參數即{月: 「1」,年: 「2015」};

並在輸出第一文檔應顯示。

感謝

+0

@JohnnyHK謝謝,我已經添加了一些示例數據。 – user3819192

回答

2

您可以使用運營商在查詢:

collection.find({ 
    "$where": function() { 
     return this.date.getMonth() == 0 && this.date.getFullYear() == 2015 
    } 
}).count(function (err, data) { 
    // Handle err 
}); 

然而,查詢的性能是相當危險,因爲使用單獨需要表掃描,它需要一個全球性的鎖。僅當您無法使用其他操作員表達您的查詢時,才應使用。如果您必須使用,請嘗試包含至少一個其他標準查詢運算符以過濾結果集。

其他選項是修改您的模式並將月份存儲在它自己的屬性中(如果它是查詢中的通用字段)。您可以保證更好的查詢性能,因爲該字段可以被編入索引。

另一種選擇是在查詢特定的月份和年份時,創建一個僅查找特定月份的開始和結束的查詢對象。

var sDate = new Date(2015, 0, 1); 
var eDate = new Date(2015, 1, 1); 

collection.find({ date: { "$gte": sDate, "$lt": eDate) } }).count(function (e, c) { 
}); 
+1

感謝您爲我的第一個解決方案,我不能使用第二個選項。 – user3819192

+0

我也發現這個解決方案http://stackoverflow.com/questions/26308525/searching-dates-and-ignoring-time-in-mongodb哪個也起作用比它更好$條件 ?我應該使用它嗎? – user3819192

+0

@ user3819192我不知道這兩種方法在性能方面的表現如何,但是由於性能低下和全局鎖定,通常不鼓勵使用'$ where'運算符。 – chridam