文档菜单
文档首页
/
MongoDB 手册
/ /

减少集合数量

在本页

  • 关于此任务
  • 示例
  • 了解更多

创建过多的集合会降低性能。随着每个集合的创建,MongoDB都会创建一个默认的_id 索引,这会使用额外的存储空间。如果你创建了过多的集合,这些集合和索引可能会对副本集资源造成压力,并降低性能。

考虑以下模式,该模式存储每天每小时的温度读数。temperature 数据库将每天读数存储在单独的集合中。

// Temperatures for May 10, 2024
{
_id: 1,
timestamp: "2024-05-10T010:00:00Z",
temperature: 60
},
{
_id: 2
timestamp: "2024-05-10T011:00:00Z",
temperature: 61
},
{
_id: 3
timestamp: "2024-05-10T012:00:00Z",
temperature: 64
}
...
// Temperatures for May 11, 2024
{
_id: 1,
timestamp: "2024-05-11T010:00:00Z",
temperature: 68
},
{
_id: 2
timestamp: "2024-05-11T011:00:00Z",
temperature: 72
},
{
_id: 3
timestamp: "2024-05-11T012:00:00Z",
temperature: 72
}
...

在未限制集合数量的情况下,默认 _id 索引的数量可能会增加,从而降低性能。

此外,这种方法需要使用 $lookup 操作来查询多个集合。$lookup 操作增加了查询复杂性,并可能会对资源造成压力。

为了减少集合的数量,可以删除或归档未使用的集合,或者通过合并相关集合、数据非规范化或在使用嵌入式文档的情况下适当利用数据模式来重构数据。

您可以将模式修改为将每天的温度读数存储在一个集合中。例如

db.dailyTemperatures.insertMany( [
{
_id: ISODate("2024-05-10T00:00:00Z"),
readings: [
{
timestamp: "2024-05-10T10:00:00Z",
temperature: 60
},
{
timestamp: "2024-05-10T11:00:00Z",
temperature: 61
},
{
timestamp: "2024-05-10T12:00:00Z",
temperature: 64
}
]
},
{
_id: ISODate("2024-05-11T00:00:00Z"),
readings: [
{
timestamp: "2024-05-11T10:00:00Z",
temperature: 68
},
{
timestamp: "2024-05-11T11:00:00Z",
temperature: 72
},
{
timestamp: "2024-05-11T12:00:00Z",
temperature: 72
}
]
}
] )

更新后的模式所需的资源比原始模式少。现在,不需要为每一天创建单独的索引,默认的 _id 索引现在可以通过日期进行查询。

返回

避免无界数组