我有一个蒙戈集合,其中每个文件都有一套独特的嵌入式按键:蒙戈DB:优化独特的嵌入式密钥基于查询
{
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)
问题是,有6000个这样的文件,它有点慢。看看Explain()日志;每个查询平均需要0.06秒才能执行,并且每次执行完整的集合扫描。 我们的服务必须做100次以上的查询(对于100个不同的密钥);在0.06 p/s的速度下,每次通话最多可以达到6秒(不包括提供数据的站点的开销)。 在一个批处理中发送所有的密钥,并执行一个大的查询将需要重写数据层;由于时间紧迫,我试图避免这种情况。 我一直在查看文档,并且似乎没有办法获得基于关键字的索引。该文件说你可以在嵌入式密钥上索引;但这似乎只是指数值。这对我也没什么好处。因为系统中的每个密钥都是唯一的;每个新密钥都必须有一个索引。
短期重新设计我们的文档结构的(这需要一个大的变化);无论如何,我能做些什么来加速对当前格式的现有集合的查询?
任何建设性输入不胜感激。
感谢, 弗兰克
为什么特定日期的粉丝数量是唯一的?不能有两个具有相同日期的粉丝数量的收集项目吗?或者你想*键*是唯一的,而不是值? – mnemosyn 2011-12-19 21:21:40
这些键必须是唯一的,因为它们是我们用来查找给定日期的指标的。我们正在从一个网站上获取这些数据,这些数据可以反映一个月内facebook粉丝的增长情况,我们需要日常的历史记录才能做到这一点。 – 2011-12-19 22:32:13
当你说键时,你是指字段名称还是字段值?我不确定我现在明白这一点... – Iain 2011-12-20 00:33:57