我目前一直在试图找出使用Mongoose与Node.js和MongoDb的某个问题。我在我的mongodb计划集合中有记录,计划日期分为3个不同的字段,一个用于存储年份,一个用于月份,一个用于日期 - 所有数字字段。例如,日期2014年7月4日将储存像这样:Mongoose复杂查询嵌套Or's/And的
_id: fjewifjweifja...
Name: "test plan name"
PlanDateYear: 2014
PlanDateMonth: 7
PlanDateDay: 4
我试图构建一个猫鼬的查询将返回我指定的开始和结束日期范围之间存在的所有计划记录。如果所有的计划日期恰好在同一年,我有查询工作得到开始和结束日期范围之间的计划,但是如果某些计划日期跨越到另一年,那么猫鼬查询逻辑会变得很糟糕。是否有一些简洁的方法可以在计划集合中具有字段的约束条件下执行此操作: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
}
是否有一个原因,这些不被存储为日期? – 2014-09-24 22:50:14
说实话,我遇到了很多存储javascript日期的问题,即使存储为UTC。应该是一个特定的一天将最终成为前一天或第二天,这取决于我的网站托管的远程服务器位置(使用heroku,我注意到网络ite是一个很远的时区的服务器)。当我将年,月和日存储为单独的字段和整数时,我真的只能从服务器获得一致的日期,然后在从数据库中提取特定日期时对这三个字段进行比较。 – jre247 2014-09-24 23:35:08
有办法解决这个问题。为了进行比较,我倾向于将所有日期存储为UTC。也可以将日期存储为YYYYMMDD,并且仍然有非常简单的比较。基本上每年的月份和日期将是最难以查询的。 – 2014-09-24 23:38:21