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

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions