【发布时间】:2014-09-25 09:55:56
【问题描述】:
我目前一直在尝试使用 Mongoose 和 Node.js 和 MongoDb 来解决某个问题。我的 mongodb 计划集合中有记录,计划日期分为 3 个不同的字段,一个用于存储年份,一个用于存储月份,一个用于存储 - 所有数字字段。例如,日期 7/4/2014 会这样存储:
_id: fjewifjweifja...
Name: "test plan name"
PlanDateYear: 2014
PlanDateMonth: 7
PlanDateDay: 4
我正在尝试构建一个 mongoose 查询,它将返回指定开始和结束日期范围之间存在的所有计划记录。如果所有计划日期恰好在同一年,我有查询用于获取开始和结束日期范围之间的计划,但是如果某些计划日期跨越到另一年,那么猫鼬查询逻辑就会变得很奇怪。在计划集合中包含以下字段的限制下,是否有一些简洁的方法可以做到这一点:PlanDateYear、PlanDateMonth 和 PlanDateDay?
非常感谢您的帮助!我已经坚持了一段时间了:(
这是我当前的查询:
Plan.find({
'user': req.user.id,
"$or" : [
{
'planDateMonth': startDateMonth,
"$and" : [
{ "planDateDay" : {$gte: startDateDay} }
,{'planDateMonth': {$ne: endDateMonth}}
//,{'planDateYear': {$gte: startDateYear}}
]
},
{
'planDateMonth': endDateMonth,
"$and" : [
{ "planDateDay" : {$lte: endDateDay} }
,{'planDateMonth': {$ne: startDateMonth}}
]
},
{
'planDateMonth': {$ne: endDateMonth},
"$and" : [
{'planDateMonth': {$ne: startDateMonth}},
{'planDateMonth': {$lte: endDateMonth, $gte: startDateMonth}},
{'planDateDay': {$lte: endDateDay, $gte: startDateDay}}
]
},
{
'planDateMonth': endDateMonth,
"$and" : [
{'planDateMonth': startDateMonth},
{'planDateDay': {$lte: endDateDay, $gte: startDateDay}}
]
}
]
}
)
.exec(function (err, plans) {
if (err) return next(err);
else {
//do stuff
}
【问题讨论】:
-
这些不存储为日期是否有原因?
-
说实话,我在存储 javascript 日期时遇到了很多问题,即使存储为 UTC 也是如此。应该是某一天的计划日期最终会在前一天或后一天结束,具体取决于我的网站托管的远程服务器位置(使用 heroku,我注意到该网站是位于遥远时区的服务器)。当我将年、月和日存储为单独的字段和整数时,我真的只能从服务器获得一致的日期,然后在从数据库中提取特定日期时对这三个字段进行比较。
-
有办法解决这个问题。我倾向于将所有日期存储为 UTC 以进行比较。也可以将日期存储为 YYYYMMDD 并且仍然可以进行非常简单的比较。基本上分开的年月日将是最难查询的。
-
是的,你完全正确。您对使用 date.getTime() 将日期存储为毫秒然后进行比较有何想法,因为我只需要在特定的开始日期和结束日期范围之间提取日期?那么,猫鼬查询将是: 'planDateAsMili': {$gte: startDateAsMili, $lte: endDateAsMili}
-
您能否将您的评论添加为答案,我会将其标记为答案?按照您的建议解决了我的问题。谢谢!