zplCloud Blog

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

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

2 分钟阅读 zplCloud Team

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

通过 zplCloud CLI agent 查询 MongoDB collection 并打印条码标签

产品数据、订单条目、序列号——如果它们已经存在于 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 套餐。参见定价页面

相关

更多文章