2013-09-05 4 views
0

Допустим, мы имеем следующую структуру данных:Как найти документы, которые соответствуют подмножество ключей

{ 
    "name": "", 
    "tags": [] 
} 

на следующем примере данных:

{ 
    "name": "Test1", 
    "tags": [ 
     "Laptop", 
     "Smartphone", 
     "Tablet" 

    ] 
} 

{ 
    "name": "Test2", 
    "tags": [ 
     "Computer", 
     "Laptop", 
     "Smartphone", 
     "Tablet" 

    ] 
} 

{ 
    "name": "Test3", 
    "tags": [ 
     "Smartphone", 
     "Tablet" 
    ] 
} 

Сейчас я пытаюсь найти: Найти все документы с помощью смартфона и планшета в тегах. Это должно вернуть все документы.

Я не могу понять, как это работает с couchdb. Я попытался добавить теги в качестве ключей и сыграл с ключом/конечным ключом без везения.

Надеюсь, кто-то может мне помочь.

Привет, Бен

ответ

1

Я вижу два возможных решения. Почему вы не имеете представления с функцией отображения типа:

function(doc) { 
    doc.tags && doc.tags.forEach(function(tag) { 
     emit(tag, null); 
    }); 
} 

Теперь, если вы запрашиваете эту точку зрения с помощью клавиш = [ «смартфон», «Tablet»] вы получите следующие строки:

{id: "A", key: "Smartphone", value: null}, 
{id: "B", key: "Smartphone", value: null}, 
{id: "C", key: "Smartphone", value: null}, 
{id: "A", key: "Tablet", value: null}, 
{id: "B", key: "Tablet", value: null}, 
{id: "C", key: "Tablet", value: null} 

Теперь вам нужно проанализировать этот ответ на стороне клиента, чтобы отфильтровать идентификаторы, которые не отображаются для всех ключей вашего запроса. В этом случае отображаются все документы (A, B, C), так что это ваш результат. После того, как вы есть, вы можете использовать насыпной GET для извлечения значения с:

POST http://...:../db/_all_docs?include_docs=true 

with keys=["A", "B", "C"] 

Это, как я бы это сделать.

Второй подход, который вы могли бы использовать, - иметь функцию карты, которая испускает все возможные подмножества doc.tags. (Find all possible subset combos in an array?). При индексной структуре, как это, вы можете получить нужные документы с помощью одного запроса просто с помощью:

key=["Smartphone", "Tablet"] and include_docs=true. 

Однако имейте в виде, что это означает, что излучающее 2 ** п (п - количество тегов) строки для просмотра , поэтому используйте этот подход, только если вы уверены, что их только для каждого документа.

+0

Благодарим вас за ответ. Уже нашли ваши решения сегодня с помощью gooogle. Думал, что есть еще одно решение этой проблемы. Также был найден проект «couchdb lucene», но это может быть действительно неэффективно, если у вас много документов. – Ben1445431