Mongodb $ или и $ eq: [] не работает, если массив пуст - PullRequest
0 голосов
/ 07 мая 2018

В коллекции (Товар) есть два документа:

[      
    {
            "_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 . Я пытался $ существует , но это не работает

Документ № 1:

этот продукт будет находиться в магазине с 2018-05-01 по 2018-05-30, но только с понедельника (9 утра) до пятницы (20 вечера)

Документ № 2:

1 - этот продукт будет в магазине с понедельника (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 голосов
/ 07 мая 2018

вы, вероятно, должны использовать $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() }} ] }
                                    ]
                                }
                            }
                        }
                    ]
                }
            ]
        })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...