2012-04-29 3 views
3

Я хочу иметь возможность добавить до 10 тегов в запись в базе данных (MongoDB), но я не хочу добавлять 10 столбцов с соответствующими индексами для каждого из них. Поэтому я решил добавить уникальную сумму этих тегов.Найти A & C In Search Результат

например. (с 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; 
    } 
} 

Моя проблема однако заключается в том, что я думал, что должна быть математическая формула, которую я мог бы использовать для запроса определенного тега, например. найдите «c tag», передав значение 4. Я либо ошибаюсь, либо не могу найти его.

Я рад пойти с решением Multikeys в Монго, но у меня есть много других данных для индекса и с использованием 1 индекса вместо 10 будет просто nicer‽

+0

Прохладная идея, чтобы сделать индекс проще. К сожалению, я не думаю, что вы можете воспользоваться индексом, если вам нужно рассчитать битмаски. –

+0

Я думаю, что вы ищете побитовое И, например: value & 4! = 0, или я не прав? (Вам нужно будет сделать это в javascript, где, который не может использовать индексы) –

ответ

1

Multikeys - это правильный подход к этой проблеме, поскольку он может найти любой документ из единого индекса в массиве без сканирования таблицы. В вашем случае вы можете просто поместить соответствующий массив букв, представляющих теги, в массив: ["a", "d", "e"].

В более сложных случаях, когда каждое поле может содержать одни и те же значения тегов, например названия песен, имена альбомов, имена артистов ... Я иногда добавляю тег фразу дважды: один раз сам по себе и один раз с именем поля предварительно отложенный, например "artist:Hello". Теперь я могу искать слово тега, происходящее в любом поле ИЛИ тег-слово, встречающееся в определенном поле, и в любом случае он будет использовать индекс для поиска совпадающих записей.

0

Преобразование метки аф в целое число 0 -5, назовите его tagValue, затем номер, который вы хотите, - 1<<tagValue.