2012-04-29 155 views
3

我希望能够在数据库(MongoDB)中为记录添加最多10个标记,但我不想在每个标记上添加10个包含相关索引的列。所以我想我会添加这些标签的唯一总和。在搜索结果中查找A和C搜索结果

例如(带有6个标签)

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

例如

A + B = 3

B + C + d = 14

然后我存储在蒙戈的值的简单相加。

这些组合总是独一无二的,我可以使用迭代从持久性存储中提取出来,将它们“重建”回标记中。

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

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

我很高兴去与蒙戈的Multikeys解决方案,但我有很多其他数据的索引,并使用1个指数,而不是10也只是nicer‽

+0

让索引更简单的好主意。不幸的是,如果你必须计算位掩码,我认为你不能利用这个索引。 – 2012-04-29 05:22:44

+0

我想你要找的是一个按位与,如下所示:value&4!= 0,或者我错了吗? (你必须在JavaScript中这样做,因为它不能使用索引) – 2012-04-29 05:26:21

回答

1

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

在更复杂的情况下,每个字段可以包含相同的标记值,例如歌曲名称,专辑名称,歌手名字,......我有时添加标签短语两次:一次是在自己和曾经与字段名预先填写,例如"artist:Hello"。现在,我可以搜索任何字段中出现的标签词或特定字段中出现的标签词,也可以使用索引查找匹配记录。

0

转换标签自动对焦进行整数0 -5,称之为tagValue,那么你想要的数字是1<<tagValue