【问题标题】:Create a schema to be used with MongoDB and Teiid that has a mongo array in the document创建一个用于 MongoDB 和 Teiid 的模式,该模式在文档中有一个 mongo 数组
【发布时间】:2019-12-18 11:41:52
【问题描述】:

我在 MongoDB 中有以下文档:

{
    "_id" : ObjectId("529632350083bc14d145bb56"),
    "CaseId" : "8f68cf65-80ad-4950-88d5-e322d0296461",
    "CaseAddressString" : "527 Irving Avenue, Rivereno",
    "CaseOpenDatetime" : ISODate("2013-11-22T17:54:50.198Z"),
    "CaseBeginDatetime" : ISODate("2013-11-19T17:54:50.198Z"),
    "CaseDescription" : "Veniam deserunt nisi pariatur non commodo pariatur in.",
    "RequestorFirstName" : "Morgan",
    "RequestorLastName" : "Nunez",
    "age" : 41,
    "gender" : "female",
    "CasePhoneNumbers" : [
        {
            "type" : "home",
            "number" : "+1 (976) 478-2278"
        },
        {
            "type" : "fax",
            "number" : "+1 (801) 463-3144"
        }
    ],
    "location" : [
        -122.394372,
        37.765385
    ],
    "CaseLat" : 37.727456,
    "CaseLong" : -122.416738,
    "ServiceName" : "Missing Sign",
    "CaseCurrentStatusDatetime" : ISODate("0NaN-NaN-NaNTNaN:NaN:NaNZ")
}

CasePhoneNumbers 数组让我有些头疼。我正在尝试构建一个可以与 Teiid 一起使用的模式文件。我已经构建了以下内容,它在我的项目中运行良好。现在要插入最后一部分,我不知所措。

CREATE FOREIGN TABLE cases(
    id varchar(50) PRIMARY KEY,
    CaseId varchar(50),
    CaseAddressString varchar(50),
    CaseOpenDatetime date,
    CaseBeginDatetime date,
    CaseDescription varchar(200),
    RequestorFirstName varchar(50),
    RequestorLastName varchar(50),
    CaseCurrentStatus varchar(25),
    age integer,
    gender varchar(20),
    CaseLat float,
    CaseLong float,
    ServiceName varchar(50)
) 
    OPTIONS(UPDATABLE 'TRUE');

【问题讨论】:

  • 看起来 Teiid 对数组数据类型(作为对象)的支持在几天前刚刚提交:TEIID-2848。 fixVersion 建议这是针对即将发布的 Teiid 8.7.1 和 8.8 版本。

标签: mongodb schema teiid


【解决方案1】:

你可以的

CREATE FOREIGN TABLE cases(
    id varchar(50) PRIMARY KEY,
    CaseId varchar(50),
    CaseAddressString varchar(50),
    CaseOpenDatetime date,
    CaseBeginDatetime date,
    CaseDescription varchar(200),
    RequestorFirstName varchar(50),
    RequestorLastName varchar(50),
    CaseCurrentStatus varchar(25),
    age integer,
    gender varchar(20),
    CaseLat float,
    CaseLong float,
    ServiceName varchar(50)
) OPTIONS(UPDATABLE 'TRUE');

CREATE FOREIGN TABLE CasePhoneNumbers (
     caseid varchar,
     type string,
     number string,
     FOREIGN KEY (caseid) REFERENCES cases (_id)
) OPTIONS(UPDATABLE 'TRUE', "teiid_mongo:MERGE" 'cases')

您可以在https://docs.jboss.org/author/display/TEIID/MongoDB+Translator查看更多文档

https://issues.jboss.org/browse/TEIID-3040 删除了详细的 IDREF 字段,但这将在 Teiid 8.9 中

【讨论】:

  • 感谢您的帖子。我希望我们可以更新应用程序以使用较新版本的 Teiid。
  • teiid-spring-boot 运行时是否支持此功能?我需要用@SelectQuery 创建实体(视图)类吗?
  • 是的,在 teiid-spring-boot 中添加了 MongoDB 支持。你可以选择添加@SelectQuery,或者你也可以用老式的方式定义一个VDB,这两种方法都可以。
  • 感谢您的快速回复。但是,当使用 org.teiid:spring-odata 公开它时,像上面的 CasePhoneNumbers 这样的嵌入文档不会显示在 OData 实体中。这是一个已知的限制还是我需要做一些事情来启用它?我是否需要为每个属性(例如“类型”和“数字”)编写 @SelectQuery 以将其公开为 OData?
  • 查看CasePhoneNumbers在Teiid中是如何暴露的,如果暴露为另一个表,那么您可以使用OData的expand能力查看相关信息。如果不是,我们需要调查CasePhoneNumbers 暴露的原因
【解决方案2】:

不确定是否相关,我在控制台上看到以下警告消息:

WARN 11524 --- [main] org.teiid.CONNECTOR: TEIID30003 Without required support 
property TableAlias, pushdown will not be enabled for SelfJoins on translator 
[mongodb, raasagent].

“raasagent”是我在 DataSources.java 中定义的 MongoDBConnectionFactory bean。

给定 MongoDB matrix_variable 集合中的以下文档:

{
    "_id" : ObjectId("5b2367c9c9e77c0007ca0111"),
    "createdOn" : ISODate("2018-06-15T07:16:25.459Z"),
    "modifiedOn" : ISODate("2018-07-02T02:04:16.661Z"),
    "variableId" : "183cf101d2334ac09bd0db9aee96081f",
    "name" : "lfzq_test",
    "description" : "",
    "lastModifiedUserEmail" : "admin1@abc.com",
    "headerRow" : {
        "rowId" : "0b002942a5b4424f98fcc270af0290c3",
        "values" : [ 
            "name", 
            "value"
        ],
        "isEncrypted" : [ 
            false, 
            true
        ]
    },
    "rows" : [ 
        {
            "rowId" : "940467f9bb724d1688086baeec05049b",
            "values" : [ 
                "lfzq123q", 
                "751c634ca5e24102a00800b386955a5c"
            ]
        }
    ],
    "deleted" : false
}

“headerRow”属性在 OData 架构中作为单独的实体类型公开,但不是“rows”属性。

我发现了以下带有 odata/$metadata 的实体类型:

<EntityType Name="headerRow">...</EntityType>
<EntityType Name="matrix_variable">...</EntityType>

希望它足够清楚。任何线索为什么“行”属性不通过 OData 公开?

【讨论】:

  • “行”未显示的原因是因为 Teiid 将关系视为“一对多”,但它没有主键 (PK)(没有 _id)。这里的“行”没有主键,因此即使可以从 JDBC 查询,OData 也不会在没有 PK 的情况下公开。在“headerRow”上,它使用父级文档的键作为其 PK。因此,您可以按行提供 PK,或者 Teiid 需要在 EntityType 中实现 ComplexTypes 支持。另一个可以做的增强是配置一个正则表达式来选择 PK。记录一张票。
  • 谢谢。我为第一个解决方案开了一张票,因为我无法更改数据。请随时在issues.redhat.com/browse/TEIID-5873 进行编辑。圣诞快乐! :)
猜你喜欢
  • 2013-11-08
  • 1970-01-01
  • 2015-08-28
  • 1970-01-01
  • 2014-03-05
  • 1970-01-01
  • 2021-03-16
  • 1970-01-01
  • 2014-08-14
相关资源
最近更新 更多