如果数组为空,Mongodb $或和eq:[]不起作用

时间:2018-05-07 15:42:43

标签: mongodb mongoose mongodb-query

集合(Product)有两个文件:

[      
    {
            "_id" : ObjectId("5af00c72cdded465976dfc41"),
            "dates" : [{
              "start": ISODate("2018-05-01T08:21:06.152Z")
              "end": ISODate("2018-05-30T08:21:06.152Z")
            }],
            "minutes" : [ 
                {
                    "start" : 1980, //1440*1+9*60
                    "end" : 8400 // 1440*5+20*60
                }
            ]
    },
    {
            "_id" : ObjectId("5af00c72cdded465976dfc41"),
            "dates" : [],
            "minutes" : [ 
                {
                    "start" : 1980,
                    "end" : 8400
                }, 
                {
                    "start" : 9240,
                    "end" : 9720
                }
            ]
    }
]

我想制定一个标准,即根据日期分钟

一周在1440分钟内被重新播放,一周中的几天从0开始:周日.... 6星期六。

我的问题是,当我日期为空时,文档2不会被返回,我认为问题来自 $ eq 。我尝试了 $ exists ,但它不起作用

文件编号1:

此产品将于2018-05-01至2018-05-30存放,但仅限于Mondy(早上9点)至周五(晚上20点)

文件编号2:

1 - 此产品将在Mondy(上午9点)至周五(下午20点)存放

 {
   "start" : 1980, //1440*1+9*60
   "end" : 8400 // 1440*5+20*60
 }

2-然后在星期六上午10点到下午18点

{
  "start" : 9240, // 1440*6+10*60
  "end" : 9720 // 1440*6+18*60
}

我的标准是:

    const minutesInWeek = date.days() * 1440 + date.hours() * 60 + date.minutes();
    this.pModel.
        find({
            $and: [
                { minutes : {
                    $elemMatch: {
                        $or : [
                            { minutes: {$eq: [ ]} },
                            { $and: [{start: { $lte: minutesInWeek }}, {end: { $gt: minutesInWeek }} ] }
                        ]
                    }
                }},
                { dates : {
                    $elemMatch: {
                        $or : [
                            { dates: {$eq: [ ]} },
                            { $and: [{start: { $lte: new Date() }}, {end: { $gt: new Date() }} ] }
                        ]
                    }
                }}
            ]
        });;

我真的很感激这方面的帮助,谢谢!

1 个答案:

答案 0 :(得分:1)

您应该首先$or使用elemMatch dates

this.pModel.
        find({
            $and: [
                { minutes : {
                    $elemMatch: {
                        $or : [
                            { minutes: {$eq: [ ]} },
                            { $and: [{start: { $lte: minutesInWeek }}, {end: { $gt: minutesInWeek }} ] }
                        ]
                    }
                }},
                {
                    $or: [
                        {
                            $where: "this.dates.length == 0"
                        },
                        {
                            dates : {
                                $elemMatch: {
                                    $or : [
                                        { $and: [{start: { $lte: new Date() }}, {end: { $gt: new Date() }} ] }
                                    ]
                                }
                            }
                        }
                    ]
                }
            ]
        })