Docs 菜单
Docs 主页
/
MongoDB Manual
/ /

减少集合数量

在此页面上

  • 关于此任务
  • 例子
  • 了解详情

创建过多集合会降低性能。 对于每个集合, 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索引现在无需为每一天使用单独的索引,可方便按日期进行查询。

后退

避免无界数组