寻找A& C在搜索结果中

时间:2012-04-29 05:02:54

标签: mongodb math indexing tagging database

我希望能够将最多10个标签添加到数据库(MongoDB)中的记录中,但我不希望在每个列上添加10个带有相关索引的列。所以我想我会添加这些标签的唯一总和。

e.g。 (带6个标签)

|------------|
|value | tag |
|------------|
|1     |a    |
|2     |b    |
|4     |c    |
|8     |d    |
|16    |e    |
|32    |f    |
|------------|

e.g。

a + b = 3

b + c + d = 14

然后我只存储Mongo中值的总和。

这些组合始终是唯一的,当使用迭代从持久存储中提取时,我可以将它们重新组合成标记。

int tagSum
for each (tag in tagCollection.OrderDescending)
{
    if (tagSum >= (int)tag)
    {
        TagProperty.Add(targetAge);
        tagSum -= (int)tag;
    }
}

我的问题是,我认为必须有一个数学公式,我可以用它来查询特定的标签,例如通过传入值4找到“c标签”。我错了或者找不到它。

我很高兴使用Mongo中的Multikeys解决方案,但我有很多其他数据需要索引并使用1索引代替10只会更好

2 个答案:

答案 0 :(得分:1)

Multikeys是解决此问题的正确方法,因为它可以在没有表扫描的情况下从阵列上的单个索引中找到任何文档。在您的情况下,您可以将表示标记的适当选择的字母放入数组中:["a", "d", "e"]

在更复杂的情况下,每个字段可以包含相同的标记值,例如歌曲名称,专辑名称,艺术家名称......我有时会添加两次标记短语:一次单独使用,一次使用字段名称预先添加例如, "artist:Hello"。现在我可以搜索任何字段中出现的标记词或特定字段中出现的标记词,并且它将使用索引查找匹配的记录。

答案 1 :(得分:0)

将标签a-f转换为整数0-5,将其称为tagValue,然后您想要的数字为1<<tagValue