【问题标题】:Nested array date matching not working in mongo嵌套数组日期匹配在 mongo 中不起作用
【发布时间】:2017-06-23 05:41:29
【问题描述】:

我有以下架构的集合模型:

{
        "id":"122HSHDJS2333222222",
        "name":"Item1",
        "image":"",
        "is_deleted":false,
        "item_blocked_on":[
            {
                "start_date":"2017-02-15T18:30:00.000Z",
                "end_date":"2017-02-24T18:30:00.000Z"
            },
            {
                "start_date":"2017-01-16T18:30:00.000Z",
                "end_date":"2017-01-26T18:30:00.000Z"
            },
        ]
    }

以上模型表示这些“项目”被阻止,对于这些开始到结束日期,因此无法显示

现在,就我而言,用户将从客户端发送“from_date”和“end_date”。 我想要的是,查询应该返回“可用”以显示用户开始和结束日期的“项目”。

我的查询,返回错误响应:-

{
        where:{
            and:[
                {
                    and:[
                        {
                            or:[{"item_blocked_on.start_date": {"gt": new Date(from_date)}},{"item_blocked_on.end_date": {"lt": new Date(from_date)}}],
                        },
                        {
                            or:[{"item_blocked_on.start_date": {"gt": new Date(end_date)}},{"item_blocked_on.end_date": {"lt": new Date(end_date)}}],
                        }
                    ]
                },
                {
                    "is_deleted":false
                }

            ]
        }
    };

如果我不清楚或做错了什么,请告诉我。

谢谢

【问题讨论】:

    标签: arrays node.js mongodb mongodb-query loopbackjs


    【解决方案1】:

    根据您的要求,您可以轻松地使用 $elemMatch,如示例所示。

         router.post('/data_find', function (req, res) {
                var database = req.Collection;
                var start_date = req.body.start_date;
                var end_date = req.body.end_date;
                if (start_date.length > 0 && end_date.length > 0) {
    database.find({ "item_blocked_on.start_date": {$gte: start_date}, "item_blocked_on.end_date": {$lt: end_date},function(err,user){
                        if (err) {
                            res.json({status: 0, message: err});
                        }
                        if (!user) {
                            res.json({status: 0, msg: "not found"});
                        }
                        res.json({status: 1, id: user._id, message: " success"});
                    })
                } else {
                    res.json({status: 0, msg: "Invalid Fields"});
                }
            });
    

    希望对你有帮助

    【讨论】:

    • 感谢您的回复,我认为您的要求是错误的。为“日期范围”预订的“项目”不应出现在输出中,不能使用$eq,因为日期时间可能会有所不同。
    • 你的问题是对的,这个查询适合你。 database.find({ "item_blocked_on.start_date": {$gte: start_date}, "item_blocked_on.end_date": {$lt: end_date}}; 也更新了代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    • 2019-06-15
    • 2014-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多