У меня проблемы с непониманием правильного способа хранения данных в mongodb. Пробовал читать много ссылок, но не смог прийти к солидному выводу. Я привык к стилю РСУБД. У меня в руках есть данные с отношениями, а db - Mongo. К проблеме - Скажем, например, у меня есть книжная коллекция, которая может иметь около 2 миллионов книг. Существует также нечто вроде подписки (например: премиум, стандарт и т. Д.). Каждая книга из 2 миллионов наверняка будет по крайней мере частью любой из подписки (также может быть частью нескольких подписчиков). У меня может быть до 200 подписки в системе.Правильный способ структурирования данных в MongoDB
Это вопрос, который касается. Как мне создать свои коллекции здесь. Я пробовал следующие
Подход 1. Создайте коллекцию с именем subscription_book_association, где один документ соответствует подписке, и я сохраняю все идентификаторы книг для этой подписки как json внутри документа. Здесь я сталкиваюсь с проблемой, когда, если для подписки есть более 0,4 миллиона книг, я должен хранить идентификаторы всех этих книг в одном документе, и я в конечном итоге превысил лимит в 16 МБ для документа.
Подход 2. Создайте коллекцию с именем book_subscription_association, где один документ соответствует книге, и я сохраняю все идентификаторы подписки для каждой книги (в виде массива) внутри документа. В этом случае я вижу, что всякий раз, когда я выполняю операцию записи по своим данным (например, присваивать/отменять несколько новых книг для подписки), мне в основном нужно обновить массив подписки, используя оператор $ push/$ pull. Это, кажется, слишком долго (скажем, 3-4 минуты).
Например:
Подписка
{
"_id" : "Standard",
"description" : "Standard Subscription",
"status" : "Active",
}
Книга
{
"_id" : "",
"name" : "Java for beginners",
"code" : "TECH",
"vendor" : "XX Publications"
"Author" : "AAA"
"Year" : "2010"
}
book_subscription_association
{
"_id" : "",
"code" : "TECH",
"displayName" : "TECH/Java for beginners",
"name" : "Java for beginners",
"permission" : [
"Standard:R",
"Guest:R"
"Premium:RW"
],
"roles" : [
"Standard",
"Premium",
"Guest"
]
}
Запрос на обновление
db.book_subscription_association.update({ }, { $pull: { roles: "Guest" } }, false,true)
db.book_subscription_association.update({ }, { $push: { roles: "Guest" } }, false,true)
Подход 3. Создайте коллекцию с именем book_subscription_mapping (например, таблицу сопоставления в РСУБД), где я храню ассоциацию отдельно для каждой книги по каждой применимой подписке. В этом случае количество документов, которые у меня есть в этой коллекции, очень велико. Хуже всего то, что у меня есть (2 миллиона X 200) документов в этой коллекции. Это поглощает много памяти и запросы на обновление/чтение также не очень эффективны.
Вариант 2 представляется мне логичным. Чтобы решить проблему выполнения, я бы использовал ['$ explain'] (https://docs.mongodb.com/manual/reference/operator/meta/explain/), чтобы понять, где это узкое место, и попытаться найти индекс, который поможет. – OzW
Более того, я думаю, что это будет полезно, если вы покажете, как выглядят ваши документы, и как выглядит ваша команда обновления. – OzW
Спасибо .. Я обновил образцы данных jsons в исходном вопросе. –