Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Menu Docs
Página inicial do Docs
/
Manual do banco de dados
/ / /

Agrupar dados com o padrão de subconjunto

O MongoDB mantém os dados acessados com frequência, chamados de conjunto de trabalho, no RAM. Quando o conjunto de trabalho de dados e índices cresce além da RAM física alocada, o desempenho é reduzido à medida que os acessos ao disco começam a ocorrer e os dados não são mais recuperados da RAM.

Para resolver esse problema, você pode fragmentar sua coleção. No entanto, a fragmentação pode criar custos e complexidades adicionais para os quais seu aplicação pode não estar preparado. Em vez de fragmentar sua collection, você pode reduzir o tamanho do seu conjunto de trabalho usando o padrão de subconjunto.

O padrão de subconjunto é uma técnica de modelagem de dados usada para lidar com cenários em que você tem uma grande array de itens em um documento, mas precisa acessar com frequência um pequeno subconjunto desses itens. Nesse caso, o tamanho do documento geralmente pode fazer com que o conjunto de trabalho exceda as capacidades de RAM do computador. O padrão de subconjunto ajuda a otimizar o desempenho reduzindo a quantidade de dados que precisam ser lidos do banco de dados para queries comuns.

Considere um site e-commerce que tenha uma lista de avaliações de um produto, armazenado em uma coleção chamada products. O site e-commerce insere documentos com o seguinte esquema na coleção products:

db.collection('products').insertOne( [
{
_id: ObjectId("507f1f77bcf86cd99338452"),
name: "Super Widget",
description: "This is the most useful item in your toolbox."
price: { value: Decimal128("119.99"), currency: "USD" },
reviews: [
{
review_id: 786,
review_author: "Kristina",
review_text: "This is indeed an amazing widgt.",
published_date: ISODate("2019-02-18")
},
{
review_id: 785,
review_author: "Trina",
review_text: "Very nice product, slow shipping.",
published_date: ISODate("2019-02-17")
},
[...],
{
review_id: 1,
review_author: "Hans",
review_text: "Meh, it's ok.",
published_date: ISODate("2017-12-06")
}
]
}
] )

Ao acessar os dados de um produto, você provavelmente precisa apenas das avaliações mais recentes. O procedimento a seguir demonstra como aplicar o padrão de subconjunto ao esquema acima.

1

Em um campo de array que contém informações sobre um documento, determine o subconjunto de informações que você mais precisa acessar. Por exemplo, na coleção products, talvez você só precise acessar as dez avaliações mais recentes.

2

Em vez de armazenar todas as avaliações com o produto, divisão sua coleção em duas coleções: uma para seus dados mais acessados e outra para seus dados menos acessados. Isso permite acesso rápido aos dados mais relevantes sem precisar carregar a array inteira.

A primeira collection, a collection products, contém os dados usados com mais frequência, como as avaliações atuais:

db.collection('products').insertOne( [
{
_id: ObjectId("507f1f77bcf86cd99338452"),
name: "Super Widget",
description: "This is the most useful item in your toolbox."
price: { value: Decimal128("119.99"), currency: "USD" },
reviews: [
{
review_id: 786,
review_author: "Kristina",
review_text: "This is indeed an amazing widget.",
published_date: ISODate("2019-02-18")
},
[...],
{
review_id: 776,
review_author: "Pablo",
review_text: "Amazing!",
published_date: ISODate("2019-02-15")
}
]
}
] )

A coleção products contém apenas as dez avaliações mais recentes. Isso reduz o conjunto de trabalho carregando apenas uma parte ou um subconjunto dos dados gerais.

A segunda collection, a collection reviews, contém dados usados com menos frequência, como avaliações antigas:

db.collection('review').insertOne( [
{
review_id: 786,
review_author: "Kristina",
review_text: "This is indeed an amazing widget.",
product_id: ObjectId("507f1f77bcf86cd99338452"),
published_date: ISODate("2019-02-18")
},
{
review_id: 785,
review_author: "Trina",
review_text: "Very nice product, slow shipping.",
product_id: ObjectId("507f1f77bcf86cd99338452"),
published_date: ISODate("2019-02-17")
},
[...],
{
review_id: 1,
review_author: "Hans",
review_text: "Meh, it's ok.",
product_id: ObjectId("507f1f77bcf86cd99338452"),
published_date: ISODate("2017-12-06")
}
] )

Você pode acessar a collection reviews sempre que precisar ver avaliações adicionais. Ao considerar onde fazer a divisão dos seus dados, armazene os campos mais usados dos seus documentos em sua collection principal e os dados usados com menos frequência em uma nova collection.

Ao usar documentos menores com dados acessados com mais frequência, você reduz o tamanho geral do conjunto de trabalho. Isso permite tempos de acesso ao disco mais curtos para as informações usadas com mais frequência que seu aplicação precisa.

Observação

O padrão de subconjunto exige que você gerencie duas collections, em vez de uma, bem como consulte vários bancos de dados quando precisar coletar informações abrangentes em um documento, em vez do subconjunto.

Voltar

Padrão de atributo

Nesta página