【问题标题】:Searching Dates and Ignoring time and date in mongoDB node.js在 mongoDB node.js 中搜索日期并忽略时间和日期
【发布时间】:2015-06-30 03:39:50
【问题描述】:

我正在使用 node.js 和 monodb 数据库,我想根据日期查询记录,我想忽略时间和日期,只有月份和年份会匹配这里是我的代码:-

  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"),
}

我将传递两个参数,即 {month:"1",year:"2015"};

并在输出中显示第一个文档。

谢谢

【问题讨论】:

  • @JohnnyHK 谢谢,我已经添加了一些示例数据。

标签: javascript node.js mongodb date


【解决方案1】:

您可以在查询中使用$where 运算符:

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

但是,查询性能相当受损,因为单独使用$where 需要进行表扫描,它需要全局锁定。只有当您无法使用其他运算符表达您的查询时,您才应该使用$where。如果您必须使用 $where ,请尝试至少包含一个其他标准查询运算符来过滤结果集。

其他选项是修改您的架构并将月份存储在其自己的属性中(如果它是您查询中的公共字段)。由于可以对字段进行索引,因此可以保证您获得更好的查询性能。

另一个选项是在查询特定月份和年份时,创建一个仅查找该特定月份的开始和结束的查询对象。

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) {
 });

【讨论】:

  • 感谢您的第一个解决方案对我有效,我不能使用第二个选项。
  • 我还发现了这个解决方案stackoverflow.com/questions/26308525/… 也有效,它比 $where 条件更好吗?我应该使用它吗?
  • @user3819192 我不知道这两种方法在性能方面的表现如何,但由于性能缓慢和全局锁定,通常不鼓励单独使用 $where 运算符。
猜你喜欢
  • 1970-01-01
  • 2017-12-07
  • 2019-03-18
  • 2018-01-25
  • 1970-01-01
  • 2016-03-15
  • 1970-01-01
  • 2015-10-06
  • 1970-01-01
相关资源
最近更新 更多