【问题标题】:Find A & C In Search Result在搜索结果中查找 A & C
【发布时间】:2012-05-09 08:02:21
【问题描述】:

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

例如(有 6 个标签)

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

例如

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 个索引会更好‽

【问题讨论】:

  • 让索引更简单的好主意。不幸的是,如果您必须计算位掩码,我认为您无法利用索引。
  • 我认为您正在寻找的是按位与,例如:value & 4 != 0,还是我错了? (您必须在不能使用索引的 javascript 中执行此操作)

标签: mongodb math indexing tagging database


【解决方案1】:

将标签a-f转换为整数0-5,叫它tagValue,那么你要的数字就是1<<tagValue

【讨论】:

    【解决方案2】:

    Multikeys 是解决这个问题的正确方法,因为它可以从数组的单个索引中找到任何文档,而无需进行表扫描。在您的情况下,您可以将代表标签的适当字母选择放入数组中:["a", "d", "e"]

    在更复杂的情况下,每个字段可能包含相同的标签值,例如歌曲名称、专辑名称、艺术家姓名……我有时会添加两次标签短语:一次单独添加,一次使用字段名称 pre -待定,例如"artist:Hello"。现在我可以搜索出现在任何字段中的标签词或出现在特定字段中的标签词,无论哪种方式,它都会使用索引来查找匹配的记录。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-25
      • 1970-01-01
      • 2014-03-14
      • 2016-09-09
      • 1970-01-01
      • 1970-01-01
      • 2020-10-09
      相关资源
      最近更新 更多