Скалярный тип TDE для массива - PullRequest
1 голос
/ 11 июля 2019

Я пытаюсь перезапустить объект JSON Array как столбец в TDE. Каким должен быть скалярный тип?

Я использую MarkLogic 10.0-1. Мой документ JSON находится во вложенной структуре, и я хочу представить представление строки, используя TDE с полями, содержащими объект массива. Я пытался использовать scalarType в качестве строки, но ошибки tde.nodeDataExtract. Есть ли способ преодолеть это?

Приведенный ниже содержит образец документа и шаблон

    var doc1 = xdmp.toJSON(
      {
        "customer":{
          "Name": "afgasdfasfasffasf", 
          "Addr": [
            {
              "AddrTypeCd": "MailingAddress", 
              "Addr1": "911 FORBES AVE", 
              "Addr2": "SUITE XXX", 
              "CityName": "asdfasfd", 
              "StateProvCd": "PA", 
              "PostalCode": "15219"
            }, 
            {
              "AddrTypeCd": "OfficeAddress", 
              "Addr1": "911 Watson AVE", 
              "Addr2": "SUITE XXX", 
              "CityName": "asdfasfd", 
              "StateProvCd": "CT", 
              "PostalCode": "15119"
            }
          ]
        }
      });

    var rowtde1 = xdmp.toJSON(
    {
      "template":{
        "context":"/customer",
        "rows":[
          {
            "schemaName":"Schemas",
            "viewName":"SampleCustomer",
            "columns":[
              {
                "name":"CustomerName",
                "scalarType":"string",
                "val":"Name"
              },
              {
                "name":"Addr",
                "scalarType":"string",
                "val":"Addr"
              }
            ]
          }
        ]
      }
    }
    );



tde.nodeDataExtract([doc1],[rowtde1]);

Ошибка выполнения:

[javascript] TDE-EVALFAILED: 
tde.nodeDataExtract([Document({"customer":{"Name":"afgasdfasfasffasf", 
"Addr":[{"AddrTypeCd":"MailingAddress", ...}, ...]}})], 
[Document({"template":{"context":"/customer", "rows": 
[{"schemaName":"Schemas", ...}]}})]) -- Eval for Column Addr='Addr' 
returns multiple values (only one is expected)

1 Ответ

0 голосов
/ 12 июля 2019

Я думаю, что немного другой подход приведет вас туда, куда вы хотите.Давайте изменим контекст с /customer на /customer/Addr.Теперь TDE может работать для извлечения одной строки для каждого элемента в массиве.(Если бы у вас была куча данных, которые вы хотите извлечь, которых нет в массиве, вы бы использовали более одного шаблона для заполнения индекса.

 var doc1 = xdmp.toJSON(
      {
        "customer":{
          "Name": "afgasdfasfasffasf", 
          "Addr": [
            {
              "AddrTypeCd": "MailingAddress", 
              "Addr1": "911 FORBES AVE", 
              "Addr2": "SUITE XXX", 
              "CityName": "asdfasfd", 
              "StateProvCd": "PA", 
              "PostalCode": "15219"
            }, 
            {
              "AddrTypeCd": "OfficeAddress", 
              "Addr1": "911 Watson AVE", 
              "Addr2": "SUITE XXX", 
              "CityName": "asdfasfd", 
              "StateProvCd": "CT", 
              "PostalCode": "15119"
            }
          ]
        }
      });

    var rowtde1 = xdmp.toJSON(
    {
      "template":{
        "context":"/customer/Addr",
        "rows":[
          {
            "schemaName":"Schemas",
            "viewName":"CustomerAddress",
            "columns":[
              {
                "name":"CustomerName",
                "scalarType":"string",
                "val":"../../Name"
              },
              {
                "name":"AddrTypeCd",
                "scalarType":"string",
                "val":"AddrTypeCd"
              },
              {
                "name":"Addr1",
                "scalarType":"string",
                "val":"Addr1"
              },
              {
                "name":"Addr2",
                "scalarType":"string",
                "val":"Addr2"
              },
              {
                "name":"CityName",
                "scalarType":"string",
                "val":"CityName"
              },
              {
                "name":"StateProvCd",
                "scalarType":"string",
                "val":"StateProvCd"
              },
              {
                "name":"PostalCode",
                "scalarType":"string",
                "val":"PostalCode"
              }
            ]
          }
        ]
      }
    }
    );



tde.nodeDataExtract([doc1],[rowtde1]);

Это дает вам одну строку для каждого адресадобавлен в представление Schemas.CustomerAddress.


Добавление информации на основе этого комментария: «Я стараюсь избегать объединений, а также создания и поддержки нескольких представлений. Каждый новый шаблон имеет свою стоимостьсервер из-за индексации. "

Стоит помнить, что представления MarkLogic реализованы не так, как представления в реляционной базе данных. Под капотом представления MarkLogic реализуются с использованием тройного индекса, поэтому соединения будут выполняться независимо.Подход, который я изложил выше, является наиболее часто используемым способом разрешения этой ситуации.

...