Запрашиваете документы, содержащие два тега, с помощью CouchDB? - PullRequest
1 голос
/ 06 сентября 2010

Рассмотрим следующие документы в CouchDB:

{
  "name":"Foo1",
  "tags":["tag1", "tag2", "tag3"],
  "otherTags":["otherTag1", "otherTag2"]
}

{
  "name":"Foo2",
  "tags":["tag2", "tag3", "tag4"],
  "otherTags":["otherTag2", "otherTag3"]
}

{
  "name":"Foo3",
  "tags":["tag3", "tag4", "tag5"],
  "otherTags":["otherTag3", "otherTag4"]
}

Я бы хотел запросить все документы, которые содержат ALL (не любых!) Тегов, указанных в качестве ключа.

Например, если я запрашиваю с помощью '["tag2", "tag3"] ", я бы хотел получить Foo1 и Foo2.

В настоящее время я делаю это, сначала запрашивая тегамидля «tag2», затем для «tag3», создавая объединение вручную.

Это кажется ужасно неэффективным, и я предполагаю, что должен быть лучший способ.

Мой второй вопрос -но они довольно связаны, я думаю - будет:

Как бы я запросил все документы, которые содержат "tag2" AND"tag3" AND"otherTag3"?

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

1 Ответ

1 голос
/ 06 сентября 2010

У вас есть максимальное количество?

  • Теги на документ и
  • Теги, разрешенные в запросе

Если это так, у вас естьверхняя граница максимального количества тегов для индексации.Например, имея максимум 5 тегов на документ и 5 тегов, разрешенных в запросе AND, вы можете просто вывести каждую комбинацию из 1, 2, 3, 4 и 5 тегов в ваш индекс, максимум до 1 (комбинации из пяти тегов + 5 (комбинации из четырех тегов) + 10 (комбинации из трех тегов) + 10 (комбинации из двух тегов)) + 5 (комбинации из одного тега) = 31 строк в представлении для этого документа.

Это может быть приемлемо для вас, учитывая, что это довольно мощныйзапрос. Использование диска может быть приемлемым (особенно если вы просто emit(tags, {_id: doc._id}) минимизируете данные в представлении, и вы можете использовать ?include_docs=true, чтобы получить полный документ позже. Последнее, что нужно помнить, это всегда выдавать отсортированный массив ключейи всегда запрашивайте его одним и тем же способом, потому что вы генерируете только теги комбинаций , а не перестановок .

, которые могут завести вас так далеко, однако они не масштабируютсядо бесконечности. Для полномасштабных произвольных запросов AND, вам действительно придется разделить нанесколько запросов, или посмотрите в CouchDB-Lucene.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...