MongoDB只有时间比较日期

Cra*_*ide 15 mongodb

如何仅使用日期查询MongoDB中的日期字段,而不是时间?例如,如果MongoDB 随时存储2015年7月7日,我希望仅将该日与当天的日期进行匹配.

在MySQL中,我会这样做 SELECT col1, col2 FROM table WHERE DATE(date_field) = DATE(NOW());

请注意MySQL如何在匹配期间将date_field更改为日期.我可以在匹配过程中使用类似功能在MongoDB中执行此操作吗?喜欢Collection.find({ dateonly(datetimefield): dateonly(new Date() });什么样的?

我知道Mongo在GMT中存储日期/时间,因此我还必须将存储的GMT日期+时间从GMT转换为本地,然后才匹配日期,但是为了让我开始,想知道我是否可以取消时间日期匹配.例如,如果格林尼治标准时间现在是7月8日03:00,而美国东部时间本地时间是7月7日23:00,那么我想要匹配7月7日.

Lip*_*ier 13

使用 $expr 是可能的

{ $expr: {$eq: ["2021-03-29", { $dateToString: {date: "$dateField", format: "%Y-%m-%d"}}]}}
Run Code Online (Sandbox Code Playgroud)


Ati*_*buj 12

您可以将日期提取为任何给定格式的字符串,并使用聚合管道将其与该格式的日期进行比较

$addFields: { "creationDate":  {$dateToString:{format: "%Y-%m-%d", date: "$createdAt"}}}},
{$match :  { creationDate:  {$eq: req.query.date}}
Run Code Online (Sandbox Code Playgroud)

  • [`$dateToString`](https://docs.mongodb.com/manual/reference/operator/aggregation/dateToString/) 运算符仅适用于聚合,但 OP 需要 `find` 运算符。 (3认同)

Max*_*nko 11

我猜你应该在当天的开始和结束之间进行范围查询(如果你今天谈论的话,还是没有结束).像这样的东西

db.collection.find({
  "date" : {"$gte": new Date("2015-07-07T00:00:00.000Z"),
            "$lt": new Date("2015-07-08T00:00:00.000Z")}
})
Run Code Online (Sandbox Code Playgroud)


小智 6

这是我建议的解决方案:

db.collection.find({
  $and: [
  {"date": {$gte: new Date("2015-07-07T00:00:00.000Z")}},
  {"date": {$lt: new Date("2015-07-08T00:00:00.000Z")}}
  ]
})
Run Code Online (Sandbox Code Playgroud)


Cra*_*ide 5

2018 年 6 月 26 日更新,修复了使用 moment() 而不是 new Date() 的代码

所以听起来没有 mongodb 相当于 MySQL 的DATE功能,就像SELECT col1, col2 FROM table WHERE DATE(date_field) = DATE(NOW())

代替本机解决方案,我通过使用 MomentJS Timezone ( http://momentjs.com/timezone/ ) 将日期/时间转换为仅限日期的数字字段来解决此问题,然后将日期存储为数字。

在我的 javascript 代码中(在 MongoDB 之外):

var localDateOnly = function(timezone, d) {
  if (d == undefined) { d = new Date(); } // current date/time
  return Number( moment(d).tz(timezone).format("YYYYMMDD") );
}
Run Code Online (Sandbox Code Playgroud)

然后我在 Mongo 记录中存储一个仅限日期的字段。

var myDate = localDateOnly("America/New_York");  // today, in YYYYMMDD number
db.birthdays.insert(
  { dateonly: myDate, event: "This day is my birthday!" }
);
Run Code Online (Sandbox Code Playgroud)

然后在我的 Javascript 代码中,我可以轻松查询今天、明天、特定日期等。

// today
var myDate = localDateOnly("America/New_York");
db.birthdays.find( { dateonly: myDate } );

// tomorrow
var myDate = localDateOnly(
  "America/New_York",
  moment().add( 1, "days" )
);  // tomorrow
db.birthdays.find( { dateonly: myDate } );

// someone wants to know birthdays on the calendar on July 15, 2015
// regardless which time zone they are in
// just find the date in YYYYMMDD format
db.birthdays.find( { dateonly: 20150715 } );
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助某人。它存储一个数字,而不是一个字符串,目的是提高其索引的性能。我还有其他代码可以强制执行一个有效的数字,在存储到数据库之前它会检查:

moment( 20150715, "YYYYMMDD", true ).isValid()  // returns true & allowed to store in the database
moment( 150715, "YYYYMMDD", true ).isValid()  // returns false, don't insert into db
Run Code Online (Sandbox Code Playgroud)