zplCloud Blog

MongoDB 作为数据源:无需导出,云中无副本

筛选条件变成原生查询文档,由你网络中的 agent 执行。连接字符串始终留在你的机器上。

2 分钟阅读 zplCloud Team

无需导出,你的 collection 在云端没有副本

“MongoDB in. Labels out.”横幅,含由 zplCore 渲染的真实标签:由 MongoDB 集合生成、带 Code 128、DataMatrix 和价格的商品标签

产品数据、订单条目、序列号——如果它们已经存在于 MongoDB,为打印标签而导出 CSV 纯粹是额外开销,而且导出在写下的那一刻就已过时。

zplCloud data hub 直接连接 collection。你网络中的 CLI agent 持有连接字符串,平台描述查询,agent 只返回匹配的文档。数据库保持对互联网不可达。

架构

zplcloud proxy 保持一条到 api.zplcloud.com 的出站 TLS 连接。你这边没有任何监听,所以没有入站端口、没有防火墙例外。查询、排序和分页被下推:agent 构建真正的 MongoDB 查询并调用 Find(filter).Sort(…).Skip(n).Limit(m)。collection 从不被下载。

第 1 步 - 用你的 MongoDB 启动 agent

# 允许多个 --mongo 标志;NAME 是你在平台中选择的名称。
zplcloud proxy --agent "Lager" \
  --mongo LOCAL="mongodb://admin:…@127.0.0.1:27017/products" \
  --mongo PROD="mongodb://admin:…@mongo.internal.lan:27017/erp"

连接字符串必须包含数据库名——它是 host 之后的部分,…:27017/products。没有它,agent 只有服务器,没有可查询的数据库。

秘密最好不进 shell 历史:

$env:ZPLCLOUD_MONGO_LOCAL_CONNECTION = "mongodb://admin:…@127.0.0.1:27017/products"
zplcloud proxy --agent "Lager"

横幅确认已注册内容:MongoDB servers: LOCAL, PROD。用 --api-key <key> 或 ZPLCLOUD_API_KEY 向平台认证;用 --service-install(Linux/Raspberry Pi 上的 systemd、Windows 上的计划任务)或 docker-compose.agent.yml 中的 ZPLCLOUD_MONGO_LOCAL_CONNECTION 使其持久化。

给 agent 一个只读用户,限定在它需要的数据库。agent 用该用户执行,因此 MongoDB 自己的角色模型就是权限边界。

第 2 步 - 创建数据源

在数据源中,agent 出现在 Remote SQL Server 下,每个 MongoDB 实例一个芯片。点击它会预填表单。

字段值
名称Lager-Artikel
类型MongoDB
服务器LOCAL(--mongo LOCAL=… 中的名称)
Collectionproducts

测试对实例做 ping 并返回 server · database。字段采样一个文档并列出字段名及其 BSON 类型。

字段发现基于样本工作,这在无模式存储中很重要:如果前几个文档没有后续文档才有的字段,它不会出现在列表中。如果你知道它存在,就在 binding 中手动添加。

第 3 步 - 过滤器如何执行

你在查询中构建的过滤行 - 列、操作符、值 - 会被翻译成 MongoDB 过滤器文档并由 agent 执行:

UI 中的操作符MongoDB
包含{ ean: { $regex: "40063813" } }
以…开头{ ean: { $regex: "^40063813" } }
={ ean: "40063813" }
> / <{ price: { $gt: 10 } } / { $lt: … }

两个值得直说的后果:

  • 没有注入面。 MongoDB 过滤器是 BSON 文档——是数据,不是被解析为代码的字符串。包含 $ 或 {} 的值仍然只是值。
  • 没有锚点的 $regex 无法使用索引。 在大 collection 上做 包含 是全表扫描。以…开头 产生 ^…,该字段上的普通索引可以提供。在大 collection 上,优先使用它。

硬性限制(来自 agent 源码)

限制值
每次请求行数1000 - limit 被钳制,默认 100
服务器选择超时15 s - 不可达的副本集在这里失败,而不是数分钟后
执行的操作只读:带 sort、skip 和 limit 的 Find

更大的结果集会分页:平台用递增的 Skip 一页页请求,每页上限 1000 个文档。因此批量打印 10 000 张标签在任何一侧都从不在内存中保留超过一页。

注意:在大的 offset 上使用 Skip 会让 MongoDB 走过被跳过的文档。对于数十万级的目录,索引排序字段能让它保持廉价;未索引的排序则不行。

第 4 步 - 在设计器和 Print Views 中使用

  • 设计器 → 测试数据 选项卡 → 数据源: 选择数据源,按加载,每个 binding 用真实文档渲染。字段长度、缺失值和编码问题在这里出现,而不是出现在标签卷上。
  • Print Views → 配置 → 数据源(Data Hub): 预览和打印使用实时查询。操作员永远不会看到背后是 MongoDB。

故障模式

症状原因
agent 在运行,data hub 中没有芯片--mongo 名称缺失,或 API 密钥属于另一个 workspace
测试 在 ~15 s 后失败服务器选择超时 - 从 agent 机器上 host 不可达、端口错误,或副本集成员公布的名字 agent 无法解析
测试 立即以 auth 错误失败用户/密码错误,或认证数据库与数据数据库不同(?authSource=admin)
字段 漏掉一个字段采样的文档不含它 - 无模式 collection 需要代表性样本
过滤器在你可见的值上无返回类型不匹配:数字字段与字符串比较。在字段列表中检查类型

套餐

data hub(通过 CLI agent 的 MongoDB 和 SQL Server 数据源)属于 Pro 套餐。参见定价页面。

相关

更多文章