Размер документа BSON превышает 16 МБ в монго-документе

Я хотел бы хранить детали билета в массиве в монго-документе. он работает нормально, пока размер документа не достигнет 16 МБ, после чего я получаю исключение (Результирующий документ после обновления превышает 16777216) и программа внезапно завершает работу. Я не могу разделить этот документ, потому что в нем хранятся все детали билета, подпадающего под этот 2016 год.

здесь идет моя структура документа.

{
   year:2016,
   purpose: ticketdetail,
   tickets:[
    {ticketid:001, desc:"xyz", created:20161231},
    {ticketid:002, desc:"xyz", created:20161231},
    {ticketid:003, desc:"xyz", created:20161231},
    .......
    .......
    {ticketid:00N, desc:"xyz", created:20161231},
   }]    
}

1 ответ

Решение

Вам нужно будет разделить ваш документ на отдельные документы, возможно, в другой коллекции. Я бы не рекомендовал GridFS, потому что вы не можете запрашивать данные в BLOB-объекте GridFS.

Вот предлагаемая структура документа:

{
  _id: ObjectId("85bf0ef0b9692c0010978359"),
  "ticketid" : "001",
  "desc" : "xyz",
  "created" : ISODate("2016-12-31T00:00:00.000Z")
}
,
{
  _id: ObjectId("85bed4257726f90010d4e21f"),
  "ticketid" : "002",
  "desc" : "xyz",
  "created" : ISODate("2016-12-31T00:00:00.000Z")
}

Примечания к этой структуре:

  1. Каждый тикет находится в отдельном документе - это делает его масштабируемым, поскольку нет ограничений на количество документов в коллекции.
  2. "Созданное" поле теперь находится в правильном поле даты. Это дает вам более точную возможность запроса.
  3. Вы сказали, что ваш исходный документ был необходим для хранения всех билетов на 2016 год. Подходящий запрос для этой новой коллекции вернет вам все билеты на 2016 год, поэтому вам не нужно хранить их все в одном документе:
db.tickets.find({
    "created" : {
            $gte: ISODate("2016-01-01"),
            $lt: ISODate("2017-01-01")
        }
    }
});
Другие вопросы по тегам