Получить номер бронирования на основе дат - PullRequest
0 голосов
/ 21 января 2019

Как я могу получить общее количество заказов, если я передам от как «1970-01-01» и до как «1970-01-05»?

Зарезервировано * Массив содержит все забронированные номера с с до до дат

Вот мои данные:

[
  {
    "_id": "5c0a17013d8ca91bf4ee7885",
    "name": "ABC",
    "reserved": [
      {
        "from": "1970-01-01",
        "to": "1970-01-02",
        "isCompleted": false
      },
      {
        "from": "1970-01-03",
        "to": "1970-01-05",
        "isCompleted": false
      },
      {
        "from": "2017-04-18",
        "to": "2017-04-23",
        "isCompleted": false
      },
      {
        "from": "2018-01-29",
        "to": "2018-01-30",
        "isCompleted": false
      }
    ]
  }
]

Я пытался получить данные с помощью запроса поиска (я знаю, что это неправильно)

db.collection.find({
  reserved: {
    $not: {
      $elemMatch: {
        from: {
          $lt: "1970-01-07"
        },
        to: {
          $gt: "1970-01-05"
        },
        "isCompleted": true
      }
    }
  }
})

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Создайте конвейер, который использует оператор $size в фильтрованном массиве.Для фильтрации вам понадобится оператор $filter, а вашим условием будет И в операторах сравнения $gte и $lte, т.е.

{ 
    "$and": [
        { "$gte": [ < from field >, "1970-01-01"] },
        { "$lte": [ < to field >, "1970-01-05"] }
    ]
}

Таким образом, ваша совокупная операция будет выглядеть примерно так:

db.collection.aggregate([
    { "$addFields": {
        "totalBookings": {
            "$size": {
                "$filter": {
                    "input": "$reserved",
                    "cond": {
                        "$and": [
                            { "$gte": ["$$this.from", "1970-01-01"] },
                            { "$lte": ["$$this.to", "1970-01-05"] }
                        ]
                    }
                }                
            }
        }
    } }
])
0 голосов
/ 21 января 2019

В основном вам нужно проверить, перекрывают ли эти временные интервалы друг друга, что означает, что reserved.from <= to и reserved.to >= from.Чтобы легко иметь дело с вложенным массивом, вы можете начать с $ unwind , а затем использовать $ count , чтобы получить общее количество подходящих документов, попробуйте:

var from = "1970-01-01";
var to = "1970-01-05";

db.collection.aggregate([
    { $unwind: "$reserved" },
    {
        $match: { "reserved.from": { $lte: to }, "reserved.to": { $gte: from  } }
    },
    {
        $count: "total"
    }
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...