【问题标题】:Mongoose complex query with nested Or's/And's具有嵌套 Or/And 的 Mongoose 复杂查询
【发布时间】: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}
  • 您能否将您的评论添加为答案,我会将其标记为答案?按照您的建议解决了我的问题。谢谢!

标签: node.js mongoose


【解决方案1】:

我会找到一种使用 Mongo 日期的方法,或者使用整数来表示日期 (YYYYMMDD),因为简单的数学比较在它们上可以正常工作。

【讨论】:

  • 非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2014-09-27
  • 1970-01-01
  • 1970-01-01
  • 2011-09-06
  • 2012-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多