MongoDB ежедневные данные в массиве - PullRequest
0 голосов
/ 26 июня 2018

это может быть глупый вопрос, но я немного новичок в MongoDB, так что давайте попробуем.

Я создаю базу данных на MongoDB, в которой будут храниться входные данные, которые будут вводиться каждые пять минут. Эта база данных в формате SQL должна возвращать что-то вроде этого: enter image description here

Основная проблема возникает здесь, я не знаю, должен ли я создавать документ для каждого idvar с записями каждого года / месяца / дня, не повредит ли это производительности, если я сделаю свой JSON примерно таким?

{
    "_id" : ObjectId("xxxxxxxxxxxxxxxxxxxx"),
    "IdVar" : "60502",
    "Years" : [ 
        {
            "2015" : [ 
                {
                    "January" : [ 
                        {
                            "Date_Start" : "2015-01-01",
                            "Date_End" : "2015-01-02"
                        }
                    ],
                    "February" : [ 
                        {
                            "Date_Start" : "2015-01-01",
                            "Date_End" : "2015-01-02"
                        }
                    ]
                }
            ]
        }
    ]
}

1 Ответ

0 голосов
/ 27 июня 2018

Во-первых, запросы к вложенным массивам всегда могут показаться утомительными.

Рассмотрим следующую коллекцию (как предложено в комментариях к этому посту ):

[
  {
    "IdVar": "60502",
    "dates": [
      {
        "start": new Date("2017-03-01"),
        "end": new Date("2017-04-01")
      },
      {
        "start": new Date("2018-04-01"),
        "end": new Date("2018-06-01")
      }
    ]
  },
  {
    "IdVar": "1337",
    "dates": [
      {
        "start": new Date("2016-08-01"),
        "end": new Date("2016-09-01")
      },
      {
        "start": new Date("2015-04-01"),
        "end": new Date("2015-06-01")
      }
    ]
  }
]

Вы хотите получить только те документы, даты которых, скажем, в 2017 году. Для этого вы можете использовать оператор $elemMatch:

db.collection.find({
  dates: {
     $elemMatch: {
        start: {
           $gte: ISODate("2017-01-01T00:00:00Z"),
           $lte: ISODate("2017-12-31T00:00:00Z")
        }
     }
  }
})

... но, как вы справедливо заявили, это вернет вам документ полностью, без изменений. Во многих случаях это будет соответствовать вашим потребностям. Возможно, вы все равно захотите спроектировать поля вашего документа в соответствии с вашим запросом : простой способ выразить это - сказать, что проекция - это SQL-эквивалент SELECT и запрос WHERE.

В качестве примера, следующее будет возвращать только поле IdVar каждого документа, соответствующего моему запросу:

db.collection.find({
  dates: {
    $elemMatch: {
      start: {
        $gte: ISODate("2017-01-01T00:00:00Z"),
        $lte: ISODate("2017-12-31T00:00:00Z")
      }
    }
  }
},
// Project your document's fields here:
{
  IdVar: true
})

... вернется:

[
  {
    "IdVar": "60502",
    "_id": ObjectId("5a934e000102030405000000")
  }
]

Аналогично запросу вы можете использовать (почти) все операторы Монго в полях проекции. Оператор $ также очень удобен при работе с вложенными массивами. Следующий код вернет то, что вам нужно, попробуйте ( MongoPlayground ):

db.collection.find({
  dates: {
    $elemMatch: {
      start: {
        $gte: ISODate("2017-01-01T00:00:00Z"),
        $lte: ISODate("2017-12-31T00:00:00Z")
      }
    }
  }
},
{
  "dates.$": 1
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...