我可以使用 MySQL Shell(我猜你正在使用的)和 Connector/Node.js 来重现它。我知道 Connector/Node.js 将正确的数据类型发送到服务器(使用 Shell,您可以使用 --trace-proto 选项检查)。
Mysqlx.Crud.Find {
collection {
name: "<some_schema>"
schema: "users"
}
data_model: DOCUMENT
criteria {
type: OPERATOR
operator {
name: "is"
param {
type: IDENT
identifier {
document_path {
type: MEMBER
value: "age"
}
}
}
param {
type: LITERAL
literal {
type: V_NULL
}
}
}
}
}
这意味着这是服务器中的一些问题。
在这种情况下,X DevAPI 表达式似乎没有产生正确的 SQL 查询。如果您查看常规日志,您应该会看到类似
SELECT doc FROM `<some_schema>`.`users` WHERE (JSON_EXTRACT(doc,'$.age') IS NULL)
问题是JSON_EXTRACT 返回的是null(JSON 类型)而不是NULL(SQL“类型”),这是 X 插件的限制。
插件解决此问题的一种方法是将JSON_EXTRACT() 替换为JSON_VALUE(),在这种情况下将返回正确的NULL 值,但我不知道它的含义。
作为一种解决方法,您可以随时使用
session.sql("select doc from `<some_schema>`.`users` where json_value(doc, '$.age') is null").execute()
同时,我鼓励您使用MySQL Server: Document Store: X Plugin 或MySQL Server: Document Store: MySQL Shell 类别在https://bugs.mysql.com/ 报告错误。
免责声明:我是 MySQL X DevAPI Connector for Node.js 的首席开发人员