MongoDB: как сделать запрос на основе интервала дат и еще одного условия, соответствующего всей дате в интервале - PullRequest
0 голосов
/ 18 ноября 2018

У меня есть коллекция монго, в которой хранится информация о продуктах, и встроенный массив, в котором хранится информация о ее доступности по дате.

{
  "product_id": "A",
  "name": "mountain bicycle",
  "cost_per_hour": "$5",
  "availability":[
    {
      "timestamp": ISODate("2018-11-19 18:30:00.000Z"),
      "available": true
    },
    {
      "timestamp": ISODate("2018-12-20 18:30:00.000Z")
      "available": true
    },
    {
      "timestamp": ISODate("2018-12-21 18:30:00.000Z")
      "available": false
    }
  ]
}

Я хочу перечислить все продукты, которые доступны на все даты в заданном интервале дат.

Пример: если я запрашиваю дату между ISODate («2018-11-19 18: 30: 00.000Z») и ISODate («2018-12-20 18: 30: 00.000Z») И доступно: true, I должен получить продукт с "product_id": "A", так как он доступен для всех дат в интервале дат.

Но если я сделаю запрос между ISODate ("2018-11-19 18: 30: 00.000Z") и ISODate ("2018-12-21 18: 30: 00.000Z") И доступно: true, я НЕ должен получить любые результаты, так как продукт недоступен для всех дат в диапазоне дат.

Я пытался использовать $ elemMatch, но он возвращает продукты, доступные в как минимум 1 дат, указанных в интервале, что мне не нужно.

Пожалуйста, руководство.

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

Слежение за документацией по:

https://docs.mongodb.com/manual/tutorial/query-array-of-documents/

на:

db.inventory.find( { "instock": { warehouse: "A", qty: 5 } } )

То, что вы ищете, выглядит примерно так:

db.StoreCollection.find( { 
         "availability": { 
              "timestamp": ISODate("2018-12-20 18:30:00.000Z")
              "available": true
          }
 })
0 голосов
/ 18 ноября 2018

Чтобы найти документы, в которых все элементов поля массива проходят запрос, вы можете инвертировать запрос, чтобы найти случай сбоя (available: false), а затем использовать $not чтобы вернуть документы только в том случае, если этот отказ не произошел:

db.test.find({
  availability: {$not: {$elemMatch: {
    timestamp: {$gte: ISODate("2018-11-19 18:30:00.000Z"), 
                $lte: ISODate("2018-12-21 18:30:00.000Z")},
    available: false
  }}}
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...