Couchbase map уменьшить для создания бинарного дерева - PullRequest
0 голосов
/ 27 марта 2020

Couchbase предлагает функциональность представления карты с уменьшением, которая может помочь в преобразовании документа JSON (MAP), а затем в применении операции сокращения к группе преобразованных JSON документов (REDUCE).

I есть требование генерировать двоичные дерево (и) LCRS (левый дочерний элемент справа) из этих документов. Рассмотрим следующий сценарий:

У меня есть два JSON документа в базе данных couchbase:

A: { subDocs: [
                {subDoc: 1},
                {subDoc: 2},
                {subDoc: 3}       
              ],
     output: "A satisfied"
    }


B: { subDocs: [
                {subDoc: 1},
                {subDoc: 3},
                {subDoc: 5}       
              ],
     output: "B satisfied"
    }

Требуется сгенерировать двоичное дерево из массива subDocs вышеупомянутого JSON документы. Выходное сообщение из каждого из вышеуказанных документов будет находиться на последнем узле соответствующих двоичных деревьев. Чтобы удовлетворить это требование, я создал индекс представления couchbase с функцией map, которая генерирует дерево из массива subdocs для каждого JSON документа. После применения операции map полученные JSON выглядят следующим образом:

1: {  label: 1,
      left: {
              label: 2,
              left: {

                    label: 3,
                    left: null,
                    right: null,
                    outputMsgDocId: "A"
               },
              right: null
           },
   right: null
 }


1: {  label: 1,
      left: {
              label: 3,
              left: {

                    label: 5,
                    left: null,
                    right: null,
                    outputMsgDocId: "B"
               },
              right: null
           },
   right: null
 }

Обратите внимание, что ключом вышеупомянутого JSON документа является метка узла root, здесь он равен 1. Теперь так как у меня есть два дерева с одинаковыми root узлами, я могу объединить их, чтобы создать одно двоичное дерево. Для этого я написал функцию Reduce, которая выдает окончательный JSON, например:

1: {  label: 1,
      left: {
              label: 3,
              left: {

                    label: 2,
                    left: null,
                    right: {

                            label: 5,
                            left: null,
                            right: null,
                            outputMsgDocId: "B"
                    },
                    outputMsgDocId: "A"
               },
              right: null
           },
   right: null
 }

Обратите внимание, что outputMsgDocId в вышеприведенном дереве перемещен в другие узлы из-за реструктуризации дерева.

Теперь описанный выше процесс работает очень хорошо. Но, читая документацию couchbase, я обнаружил, что было упомянуто, что функция Reduce не должна использоваться для преобразования структуры JSON или объединения элементов вместе. Кроме того, в документации было написано, что для составных структур максимальный размер вывода может составлять 64 КБ. Это заставило меня немного скептически относиться к развертыванию этого решения с помощью карты couchbase. Мой вопрос: может ли couchbase поддерживать такую ​​сложную карту, сокращать функции в течение длительного периода времени, пока увеличивается объем данных? Является ли хорошим выбором использование представлений couchbase для создания деревьев из JSON документов? Или я должен найти какой-то другой способ генерации таких деревьев и последующего сохранения их в контейнерах на диване?

...