Как воспроизвести только пересечение определенных каналов в Couchbase Mobile

В моем приложении есть четыре канала: A, B, C, D. Некоторым пользователям приложения интересны только документы, содержащиеся в обоих каналах A и B только. Также может быть выражено как: A ∩ B. Других может заинтересовать другая комбинация, например: A ∩ B ∩ D.

ОБНОВЛЕНИЕ

Не думаю, что следующее будет работать в любом случае

До сих пор было предложено создать новый канал (например, A_B и A_B_D) для каждой комбинации, а затем соответствующим образом пометить документы, соответствующие критериям пересечения. Но вы можете видеть, как это может легко выйти из-под контроля, поскольку всего с 4 каналами вы получите 15 комбинаций (11 дополнительных каналов).

Есть ли способ сделать это с помощью каналов или, возможно, какой-то другой функции, которую я пропустил в Couchbase?


person janakagamini    schedule 24.02.2016    source источник
comment
Почему это не работает? Кроме того, 15 каналов не являются большой проблемой. Если у вас более 4 критериев, вам нужны не все комбинации, а только те, которые действительно запрашиваются некоторыми пользователями. Довольно распространен сценарий наличия канала для каждого пользователя, так что это не должно быть проблемой.   -  person TAM    schedule 16.04.2016


Ответы (1)


Назначение каналов документу осуществляется с помощью функции синхронизации. Таким образом, документ не «содержится» в канале, но может иметь атрибуты, из которых могут быть получены каналы, на которые он направляется. Только в самом простом случае по умолчанию атрибут канала документа направит его на канал, имеющий это значение этого атрибута.

Итак, то, что вы намереваетесь, может быть достигнуто путем размещения таких утверждений, как

if (doc.areas.includes("A") && doc.areas.includes("B") {
   channel("AB");
}

в функцию синхронизации. (Я переименовал атрибут каналов в области, чтобы читатель программы понял, что это не настоящие каналы, а каналы являются производными только от их комбинаций.)

person TAM    schedule 05.03.2016