【发布时间】:2014-09-29 18:37:47
【问题描述】:
我有一个非常大的集合(超过 800k),我需要实现一个基于标签的自动完成(仅基于单词开头)功能的查询。我的文档如下所示:
{
"_id": "theid",
"somefield": "some value",
"tags": [
{
"name": "abc tag1",
"vote": 5
},
{
"name": "hij tag2",
"vote": 22
},
{
"name": "abc tag3",
"vote": 5
},
{
"name": "hij tag4",
"vote": 77
}
]
}
例如,如果我的查询将针对所有以“ab”开头并且具有“somefield”即“some value”的标签,则结果将是“abc tag1”、“abc tag3”(仅名称)。 我更关心查询的速度,而不是插入和更新的速度。
我认为聚合框架是正确的方法,但是对于非常快速的查询来说,最好的管道和索引是什么?
文档不是“标签”文档,它们是代表客户端对象的文档,它们包含更多数据字段,我为简单起见省略了这些字段,每个客户端都有多个标签和另一个字段(我更改了它的名称,因此不会混淆带有标签数组)。我需要获得一组客户拥有的所有标签不重复的集合。
【问题讨论】:
-
我去年尝试做类似的事情,但数据库要小得多。随着数据量的增长,我最终不得不使用 Solr。
-
您可以发布您尝试过的查询和索引吗?你用过聚合框架吗?
-
对不起,代码早已不复存在,但它是基于标签字段上的正则表达式。它早于聚合框架,但我不确定这是否是最好的方法。根据我的经验,聚合框架喜欢将整个文档读入内存,即使 $match 可以仅使用索引来完成
标签: mongodb mongodb-query mongodb-indexes