Skip to content

driver-mongodb 是 { field: {} } 唯一还在作答的后端:#5240 拍板拒收、#5327 已闸四家,mongodb 仍译成「字段深等于空文档」 #5376

Description

@os-zhuang

同步 PR #5323 到当前 main(#5239 的接力单)时逐条复核其散文论断,发现其中「{ field: {} } 尚未在任何后端设闸」已过时:#5327 已按 #5240 的拍板在 driver-sql / driver-sqlite-wasm / driver-memory / formula 四家落闸(INVALID_FILTER / 400,消息点名位置)。driver-mongodb 是第五家,不在 #5240 的「四后端」范围里,今天仍在作答。按 PD #10 立单,unassigned。

现场

packages/plugins/driver-mongodb/src/mongodb-filter.ts,translateCondition 的字段路径:值是对象但没有任何 $ 键时走「Nested object — treat as exact match」,于是:

translateFilter({ stage: {} })   =>   { "stage": {} }

MongoDB 把 { stage: {} } 读作字段深等于空文档 —— 与 driver-memory 修复前 mingo 的读法同款(#5327 的实现评论里实测过:特意播的 a: {} 行会被选中)。也就是说这不是 FALSE,是另一个 filter,只在正常数据上看着像 FALSE。

PR #5323(合入后)的 reduceFilterKey 刻意把带字段键的节点一律判 'clause'、译文逐字节不变 —— 它当时的注释写明「不替 #5240 做裁决」;拍板(取拒收)与四家落闸都发生在其 base 之后。同步轮已把注释校订为指向本单,归约判定未动。

建议(照抄先例即可)

#5327 在 driver-sql 的落法同构:闸门放在归约的校验遍历(reduceFilterKey,与 assertFilterNode 并列),不是发射器 —— 发射器会被布尔单位元整体短路,{ $or: [ { a: {} }, {} ] } 在发射器侧永远见不到 { a: {} },拒不拒收取决于兄弟节点(#5327 PR 正文的原论证)。消息首句照抄 driver-sql 的 emptyFieldConstraintError,一况一词(#5240)。

判定本身不改:字段键仍是 'clause',这是加一条拒收,不是重分类幸存形状。

关联

未验证

未跑真 mongod(本容器取不到 mongodb-memory-server 二进制);{ stage: {} } 的译文由 translateFilter 纯函数实测,服务端读法引自 MongoDB 文档语义与 #5327 对 mingo 的实测同款,未在真服务端复测。

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions