如何仅使用日期查询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)
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)
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)
| 归档时间: |
|
| 查看次数: |
25163 次 |
| 最近记录: |