用于子文档数组上的范围查询的最佳分片键(或优化查询)

时间:2016-08-21 14:14:13

标签: mongodb mongodb-query sharding

以下是我数据库中文档的简化版本:

{
    _id : 1,
    main_data : 100,
    sub_docs: [
        {
            _id : a,
            data : 100
        },
        {
            _id: b,
            data : 200
        },
        {
            _id: c,
            data: 150
        }
    ]
}

所以想象一下,我有很多这些文件具有不同的数据值(比如0-1000)。 目前我的查询类似于:

db.myDb.find(
    { sub_docs.data : { $elemMatch: { $gte: 110, $lt: 160 } } }
)

我可以使用任何分片键来帮助查询吗?目前它正在查询所有分片。 如果没有,是否有更好的方法来构建我的查询?

1 个答案:

答案 0 :(得分:1)

杰克逊,

你正在以正确的方式思考这个问题。 MongoDB中广播查询的问题在于它们无法扩展。

任何未在分片键上过滤的MongoDB查询都将广播到所有分片。此外,范围查询可能会导致广播,至少会导致您的查询被发送到多个分片。

所以这里有一些需要考虑的事情

  • 查询频率 - 范围查询是您最常查询的吗?什么 是预期的工作量?
  • 范围逻辑 - 对于你的目标,是否存在任何内在逻辑 适用范围?让我们说,你会说0-200很小,200 - 400 是中等的。您可以在文档中添加另一个字段 和它上面的碎片。
  • 其他分片候选词 - 有时还有其他字段 它可以包含在您的所有或大多数查询中 提供良好的分配。通过将过滤与您的范围相结合 您可以将查询限制为一个或更少的分片。
  • 中断数组 - 您可能会有多个文档 一个数组。在这种情况下,您将拥有多个文档,一个用于 每次出现的数组和主数据都会重复出现 多文件。对此项目的范围查询仍然是a 问题,但你可能涉及多个分片,不一定所有 (这取决于您的数据人口统计和查询模式)

归结为数据和查询的性质。您提供的示例文档是非常匿名的,因此很难知道您域中哪些好的分片候选对象。

如果您打算经常更新文档以向阵列添加更多条目,最后一条建议是小心插入/更新查询模式。 Growing documents present scaling problems for MongoDB. See this article on this topic.