【问题标题】:Mongo DB: optimizing a unique embedded key based queryMongo DB:优化基于唯一嵌入键的查询
【发布时间】:2011-12-19 20:48:31
【问题描述】:

我有一个 Mongo 集合,其中每个文档都有一组唯一的嵌入键:

{
    Facebook :
    {
        Archived:'False' //non unique
        'fan_count_December_19_2011':12345, //unique
        'unique_views_count_December_19_2011':12345, //unique
        'post_count_December_19_2011':12345, //unique
        ...
        ...
    }
}

我们使用以下查询查找这些文档:

db.metrics.find({
    {'Facebook.fan_count_December_19_2011' : {'$ne':null}},'Archived':'False'}
}
).limit(1)

问题是,有 6,000 个这样的文档,速度有点慢。查看 Explain() 日志;每个查询平均需要 0.06 秒来执行,并且每次都进行一次完整的集合扫描。 我们的服务必须执行上述查询大约 100 次(针对 100 个不同的键);在 0.06 p/s 时,每次调用最多加起来 6 秒(不包括提供数据的站点的开销)。 批量发送所有键并执行一次大型查询将需要对数据层进行重大重写;由于截止日期紧迫,我试图避免这种情况。 我一直在查看文档,似乎没有办法拥有基于键的索引。该文档说您可以对嵌入式键进行索引;但这似乎只是索引值。这对我也没有多大好处。因为系统中的每个键都是唯一的;每个新键都必须有一个索引。

没有重新设计我们的文档结构(这需要进行重大更改);无论如何我可以做些什么来加快这个查询对现有集合的当前格式?

非常感谢任何建设性的意见。

谢谢, 弗兰克

【问题讨论】:

  • 为什么特定日期的粉丝数是唯一的?不能有两个收藏品在给定日期拥有相同数量的粉丝吗?还是您希望 是唯一的,而不是值?
  • 键必须是唯一的,因为它们是我们用来查找特定日期的指标的。我们正在使用来自一个网站的数据,该网站绘制了给定月份 facebook 粉丝增长图表,我们需要每天的历史记录来做到这一点。
  • 你说的key是指字段名还是字段值?我不确定我现在是否理解这一点......

标签: c# .net mongodb


【解决方案1】:

假设您在处理完文档后将 Archived 字段设置为 true,您可以仅在 Archived 字段上创建索引。

通常您不会在基数较低的字段上创建索引,但在这种情况下它可能对您有用,但前提是存档字段为假的文档并不多。

从长远来看,您应该重新设计您的文档,这样您就没有那么多独特的字段名称(类似于 Iain 建议的“Facebook.date”字段)。这样你就有了可以创建索引的东西。

【讨论】:

    【解决方案2】:

    这是一个猜测,但我怀疑它正在进行范围扫描,因为:

    1. 您尚未在该字段上指定索引,或者
    2. 您正在执行一个不相等的过滤器,它可能不使用索引...在 Mongo 文档中它说“MongoDB 的 $ne 或 $nin 运算符对索引无效。”

    我建议您为“Facebook.fan_count_December_19_2011”字段编制索引,并使用大于运算符。

    db.metrics.find({
        {'Facebook.fan_count_December_19_2011' : {'$gte':1}},'Archived':'False'}
    }
    ).limit(1)
    

    当然,您将需要创建大量索引,但您可以在脚本中提前完成,而无需付出太多努力。

    您也可以考虑将 日期 存储为字段,然后您可以像下面这样:

    db.metrics.find({
        {'Facebook.date' : {'$gte':'2011-12-01'}},'Archived':'False'}
    }
    ).limit(100)
    

    无论哪种方式,您都需要一个索引,这是无法避免的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-22
      • 2012-04-28
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 2011-06-28
      • 1970-01-01
      相关资源
      最近更新 更多