【问题标题】:TDE Scalar Type for Array数组的 TDE 标量类型
【发布时间】:2019-07-11 14:24:58
【问题描述】:

我正在尝试将 JSON 数组对象作为 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)

【问题讨论】:

    标签: marklogic marklogic-9


    【解决方案1】:

    我认为稍微不同的方法会让你到达你想去的地方。让我们将上下文从/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 的视图是使用三重索引实现的,所以无论如何都会有连接。我上面列出的方法是处理这种情况的常用方法。

    【讨论】:

    • 谢谢戴夫。我试图避免加入以及构建和维护多个视图。由于索引,每个新模板都会在服务器上产生成本。有没有办法将 JSON 的特定部分(即我的示例中的 Addr 数组)作为 TDE 中的列?我有精通 SQL 和 JSON 的应用程序开发人员和测试人员,我正在尝试为他们提供 TDE 视图以快速查询他们的数据,同时减少对应用程序性能至关重要的集群的压力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-09
    • 2012-10-29
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多