Агрегация MongoDB с вложенным массивом свойств объектов с датой - PullRequest
2 голосов
/ 09 июля 2020

У меня есть примерно такие данные

{
  "_id": ObjectId("52ed12c144aecc4bf004d0b6"),
  "active": true,
  "name": "woslo",
 "specialDays": [
  {
  "_id": ObjectId("5f0576196198a715b0a72c14")
  "status": true
  "date": 2020-07-08T04:00:00.000+00:00
  },
  {
  "_id": ObjectId("5f05a3726198a715b0a72c94")
  "status": false
  "date": 2020-07-09T04:00:00.000+00:00
  }
 ]
}

Я хочу получить записи с помощью этого запроса

   db.serviceProviders.aggregate([
    {
      $match: {
            specialDays: {
              $elemMatch: {
                $or: [
                  {
                    $and: [
                      {
                        date:  model.date // 2020-07-09T06:00:00.000Z
                      },
                      {
                        status: true
                      }
                    ]
                  },
                  {
                    date: {
                      $ne:  model.date //2020-07-09T06:00:00.000Z
                    }
                  }
                ]
              }
            }
          }
        }
  ]);

Сценарий : если дата присутствует в массиве specialDays и статус должен быть истинным, или дата не должна быть в массиве объекта specialDays, тогда выберите эту запись. Но каждый раз, когда он получает ту же запись, которая выше, даже статус false или дата присутствует в массиве. Не могли бы вы помочь мне, как это понять? Я пробовал много запросов в Mon go compass aggregation с ISODate ('2020-07-08') , но все еще не работал. Спасибо, счастливого кодирования.

1 Ответ

2 голосов
/ 09 июля 2020

Проблема в вашем состоянии $ne. Если статус ложный, то ваше условие $ne верно. Поскольку это логическое ИЛИ, вы получаете результат.

Как насчет this ?

db.collection.aggregate([
  {
    $match: {
      specialDays: {
        $elemMatch: {
          $or: [
            {
              $and: [
                {
                  date: new Date("2020-07-09T04:00:00.000+00:00")
                },
                {
                  status: true
                }
              ]
            },
            {
              date: {//Changes here
                $gte: new Date("2020-07-09T06:00:00.000+00:00"),
                $lte: new Date("2020-07-09T23:59:59.000+00:00")
              }
            }
          ]
        }
      }
    }
  }
])

OR

this

Другая причина вашего условия $ne истинна, потому что оно удовлетворяет вашему первому элементу массива в specialDays array

db.collection.aggregate([
  {
    $match: {
      specialDays: {
        $elemMatch: {
          $or: [
            {
              $and: [
                {
                  date: new Date("2020-07-09T04:00:00.000+00:00")
                },
                {
                  status: true
                }
              ]
            },
            {
              $and: [
                {
                  date: {
                    $ne: new Date("2020-07-09T04:00:00.000+00:00")
                  }
                },
                {
                  status: false
                }
              ]
            }
          ]
        }
      }
    }
  }
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...