MarkLogic Schema、Trigger、Module概念解析及数据库迁移文档制作技术咨询
MarkLogic Schema、Trigger、Module概念解析及数据库迁移文档制作技术咨询
Hey there, let's break this down piece by piece—no need to feel overwhelmed, we’ll unpack every part clearly for you!
一、核心概念:Schema、Trigger、Module 到底是什么?
1. Schema(模式)
- 用途:MarkLogic的Schema不像关系型数据库那样强制约束数据结构,它更像一份“数据规范说明书”——用来定义JSON/XML文档的结构、字段类型、规则,帮你统一数据格式,让查询、索引更高效,也能避免团队成员随意写混乱的文档结构。
- 创建方式:你可以写XSD(XML Schema)或者JSON Schema文件,然后上传到专门的Schema数据库(比如MarkLogic默认的
Schemas数据库,或者你自己新建的Schema库)。之后在业务数据库的配置里,关联这个Schema库,业务库就能识别并应用这些Schema规则了。 - 是否必须:完全看需求!如果你的数据是无结构的自由文档,完全可以不用Schema。
2. Trigger(触发器)
- 用途:相当于数据库的“自动响应按钮”——当数据库发生特定操作(比如插入、更新、删除文档)时,自动触发你预先写好的逻辑。比如插入文档后自动添加时间戳、更新后同步数据到其他系统、删除前做数据备份等。
- 创建方式:可以通过Admin UI可视化创建,也可以用XQuery/JavaScript代码调用触发器模块创建。创建前要先在目标数据库的配置里开启“Enable Triggers”选项。
- 是否必须:不是强制的,只有当你需要自动化业务逻辑时才需要配置。
3. Module(模块)
- 用途:就是你写的可重用代码片段(XQuery/JavaScript),比如一个通用的文档导入函数、数据格式化工具,把它们存到专门的Module数据库(比如默认的
Modules数据库),之后其他代码或者REST API可以直接调用这些模块,避免重复写相同逻辑。 - 创建方式:直接把写好的代码文件上传到Module数据库,或者用代码动态创建模块。后续可以在App Server的配置里指定这个Module库,让服务器能找到并加载这些模块。
- 是否必须:如果你的代码都是单次使用、不需要复用,不用专门的Module库也没问题,但复用场景下模块能大幅提升效率。
二、创建数据库时的常见疑问
- 是否必须同时创建Schema、Trigger、Module相关资源?
完全不需要!这些都是可选组件,根据你的业务需求来决定要不要加。比如一个简单的文档存储库,只需要创建基础数据库和森林就行,不用碰Schema、Trigger或Module。 - 配置差异?
- 如果用Schema:需要先创建Schema数据库,再在业务库的配置里关联它。
- 如果用Trigger:需要在业务库的配置里开启触发器功能,再创建具体的触发器规则。
- 如果用Module:需要创建Module数据库,再在App Server里指定这个库作为模块源。
三、你的迁移文档项目实操指南(四个示例库+双森林)
你需要创建SampleDoc、SampleModule、SampleSchema、SampleTrigger四个库,每个至少配2个森林,下面是具体步骤:
1. 先创建森林(每个库对应2个)
打开MarkLogic Admin UI,按以下步骤操作:
- 进入
Forests页面,点击Create Forest - 给森林命名(比如
SampleDoc-Forest1、SampleDoc-Forest2),指定存储路径,重复操作创建每个库对应的2个森林
2. 创建四个数据库并关联森林
进入Databases页面,点击Create Database,逐个创建四个库:
- SampleDoc(业务文档库):
- 填写数据库名,在
Forests部分添加刚才创建的2个SampleDoc森林 - 其他配置保持默认即可,后续可以导入一些测试JSON/XML文档
- 填写数据库名,在
- SampleSchema(Schema存储库):
- 填写数据库名,添加2个SampleSchema森林
- 可以在
Schema Database选项里选择自身(后续用来存Schema文件)
- SampleModule(模块存储库):
- 填写数据库名,添加2个SampleModule森林
- 后续可以上传测试用的XQuery/JS模块
- SampleTrigger(触发器演示库):
- 填写数据库名,添加2个SampleTrigger森林
- 找到
Triggers部分,勾选Enable Triggers开启触发器功能
3. 给每个库添加示例内容(方便迁移测试)
- SampleDoc:导入几个测试文档,比如:
{"id": "1", "name": "Test User 1", "email": "user1@example.com"} - SampleSchema:上传一个简单的JSON Schema,比如
user-schema.json:{ "$schema": "http://json-schema.org/draft-07/schema#", "type": "object", "properties": { "id": {"type": "string"}, "name": {"type": "string"}, "email": {"type": "string", "format": "email"} }, "required": ["id", "name"] } - SampleModule:上传一个简单的XQuery模块
sample-greet.xqy:xquery version "1.0-ml"; module namespace sample = "http://example.com/sample"; declare function sample:greet($name as xs:string) as xs:string { "Hello, " || $name }; - SampleTrigger:创建一个预提交触发器,插入文档时自动添加
created-at字段:
先在SampleModule里创建add-timestamp.xqy:
然后用XQuery创建触发器(可以在Query Console执行):xquery version "1.0-ml"; let $current-doc := xdmp:current-document() return xdmp:node-insert-child($current-doc, <created-at>{fn:current-dateTime()}</created-at>)xquery version "1.0-ml"; import module namespace trgr = "http://marklogic.com/xdmp/triggers" at "/MarkLogic/triggers.xqy"; trgr:create-trigger( "auto-add-timestamp", trgr:trigger-data-event( trgr:document-insert-event(("/")), trgr:database("SampleTrigger") ), trgr:trigger-module( xdmp:database("SampleModule"), "/add-timestamp.xqy" ), trgr:trigger-options("pre-commit") )
4. 从Server A迁移到Server B的步骤
- 备份Server A的四个数据库:
- 用Admin UI:进入每个数据库的页面,点击
Backup,指定备份路径,开始备份 - 或者用代码执行:
xdmp:database-backup(xdmp:database("SampleDoc"), "/path/to/backup")(每个库单独执行)
- 用Admin UI:进入每个数据库的页面,点击
- 复制备份文件到Server B:把Server A的备份文件夹复制到Server B的MarkLogic备份目录(比如
/var/opt/MarkLogic/backups) - 在Server B创建对应森林和数据库:完全复刻Server A的结构(森林数量、名称,数据库配置)
- 恢复数据库:
- 用Admin UI:进入每个数据库的页面,点击
Restore,选择对应的备份文件,开始恢复 - 或者用代码执行:
xdmp:database-restore(xdmp:database("SampleDoc"), "/path/to/backup/SampleDoc")
- 用Admin UI:进入每个数据库的页面,点击
- 验证迁移结果:
- 检查SampleDoc的文档是否完整
- 验证SampleSchema的Schema是否能正常应用
- 调用SampleModule的模块函数测试是否可用
- 在SampleTrigger插入文档,检查是否自动添加
created-at字段
如果在任何步骤卡壳,随时聚焦具体问题提问——慢慢来,你已经在正确的路上啦!
备注:内容来源于stack exchange,提问作者Abuti
相关产品推荐
相关产品推荐

