具有嵌套Or / And的Mongoose复杂查询

时间:2014-09-24 22:10:10

标签: node.js mongoose

我目前只是试图使用Mongoose与Node.js和MongoDb来解决某个问题。我在我的mongodb计划集合中有记录,计划日期分为3个不同的字段,一个用于存储年份,一个用于月份,一个用于日期 - 所有数字字段。例如,日期7/4/2014将按如下方式存储:

_id: fjewifjweifja...
Name: "test plan name"
PlanDateYear: 2014
PlanDateMonth: 7
PlanDateDay: 4

我正在尝试构建一个mongoose查询,它将返回指定的开始日期和结束日期范围之间存在的所有计划记录。如果所有计划日期恰好在同一年,我有查询工作来获取开始和结束日期范围之间的计划,但是如果某些计划日期交叉到另一年,则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
    }

1 个答案:

答案 0 :(得分:0)

我会找到一种方法来处理Mongo日期,或者使用整数来表示日期(YYYYMMDD),因为简单的数学比较可以按预期工作。