【问题标题】:Mongo DB track DDL changesMongodb 跟踪 DDL 更改
【发布时间】:2018-11-12 07:12:47
【问题描述】:

我是 Mongo DB 的新手。我来自 RDBMS/MPP/ETL 背景,我使用的大多数数据存储都有关于对象的元数据(表视图等)。我的疑问是 Mongo DB 特有的。它有吗任何数据字典(如 Oracle user_tables)或有关集合的任何其他元信息上次 DDL 更新时间,因为 MongoDB 是无模式数据库,应用程序可以在不更改模式的情况下更改插入数据。因此,当存在 MongoDb 时,在运行 ETL 作业之前找到任何结构更改很重要涉及。我搜索了字典或任何跟踪 DDL 更改的 API 信息,但一无所获。任何人都可以指导我找到与此相关的链接或信息。如果没有这样的选项,是否有任何更好的最佳实践可以遵循以避免这种模式演变

谢谢 阿努普R

【问题讨论】:

    标签: mongodb schema ddl


    【解决方案1】:

    使用 Mongodb 的优点之一是其存储文档的无模式结构。现在与 RDBMS 表字典不同,模式位于 MongoDb 用户的应用程序层。这使应用程序可以灵活地设计/更改架构,而无需等待任何更改语句依赖项。

    话虽如此,Mongodb 3.2 引入了模式验证,3.4 丰富了它。您可以在Mongodb document validation 了解有关验证的更多信息。使用 validator 选项在每个集合的基础上指定验证规则,该选项采用指定验证规则或表达式的文档。

    关于模式验证需要注意的一点不是跟踪 ddl 更改,而是建立一个商定的定义。

    【讨论】:

    • 我添加了一个您可以验证的答案。我仍在研究解决方案,因为我面临一些 str 数据类型的问题
    • @AnoopR 您只是对 30 个文档进行抽样并确定模式结构的类型。它是如何做到万无一失的,如果您最终扫描每个文档,那么它在生产量上的表现会很差。怎样才能更好?
    • 您好,实际上出于单元测试的目的,我提供了 30 条记录。在实际场景中,所有的增量数据都会被考虑在内,这是一个耗时的过程,因此大多数情况下会按计划运行
    • 仔细想想,为什么你的工作会关心他的字段,只要它不是“select *”类型的查询。让批处理作业仅选择处理它所需的字段。这样您就可以利用架构验证并摆脱这种扫描。
    • 是的,除非并且直到某些数据类型发生变化,否则我们的工作通常不会失败。但它是一种审计机制,可以了解架构演变并通知各自的利益相关者
    【解决方案2】:

    我得到了一个我实际上并没有尝试的解决方案,但我认为我们可以使用它来管理。`

    数据类型的默认清单

    key_type_default_count = {
        int: 0,
        float: 0,
        str: 0,
        bool: 0,
        dict: 0,
        list: 0,
        set: 0,
        tuple: 0,
        None: 0,
        object: 0,
        unicode: 0,
        "other": 0,
    }
    

    获取mongo连接的自定义代码

    client = create_mongo_con(v_env,v_con_name)
    print client
    
    db = client[v_db_name]
    collection = db[v_collection]
    

    主要代码

    key_type_count = defaultdict(lambda: dict(key_type_default_count))
    
    
    mongo_collection_docs = collection.find({},{"_id":0}).limit(30)
    #print mongo_collection_docs'
    print type(mongo_collection_docs)
    
    for doc in mongo_collection_docs:
    
        for key, value in doc.items():
            print ' my key '+str(key)
            print 'my value is '+str(value)
            print ' my value type '
            print type(value)
            if type(value) in key_type_count[key].keys():
                key_type_count[key][type(value)] += 1
            else:
                key_type_count[key]["other"] += 1
        total_docs += 1`
    

    您可以参考更多关于 https://github.com/nimeshkverma/mongo_schema 的信息,我从那里得到了这个想法,但该代码不起作用。我编辑了一些部分,现在我能够生成这样的漂亮输出

    但现在我面临一个问题,所有字符串字段都被检测为 unicode。如果我们有解决方案,我需要弄清楚这一点。如果有人在 python 中遇到 str 和 unicode 相同的问题,请发表评论

    【讨论】:

    • 这不是一个可扩展的解决方案,不应该用于 PROD
    • 我同意你的观点。但这不是日常工作的一部分,甚至我们可以验证更相关的集合。所以我认为当你在 delta 上运行时这不会成为问题用于验证的数据。
    • 你怎么知道它的增量数据?如何保留已搜索和未搜索内容的水印?
    • 这不是最终代码。我们需要保留上次更新时间并仅过滤大于上次更新日期的记录。这是正常的 ETL 世界解决方案,我们尝试了此方法并为我们的集合工作。目前我们没有遇到任何性能问题。正如你所说,对于具有数百万实时数据的集合,我们不能使用这种方法。无论如何,对于那些类型的集合,我们不会使用简单的 python 脚本方法
    猜你喜欢
    • 2021-09-28
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    • 2015-03-27
    相关资源
    最近更新 更多