2015-04-22 120 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