Я думаю, что немного другой подход приведет вас туда, куда вы хотите.Давайте изменим контекст с /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 реализуются с использованием тройного индекса, поэтому соединения будут выполняться независимо.Подход, который я изложил выше, является наиболее часто используемым способом разрешения этой ситуации.