如何查询null或缺失字段在Mysql X DevAPI?
我尝试了.find("age IS NULL")
和.find("age = null")
,但都不工作。
> db.createCollection('users')
> db.getCollection('users').add({ name: "foo", age: 30 })
> db.getCollection('users').add({ name: "bar", age: null })
> db.getCollection('users').find("age IS NULL")
Empty set (0.0003 sec)
> db.getCollection('users').find("age = null")
Empty set (0.0004 sec)
我能够用MySQL Shell(我猜是你正在使用的)和Connector/Node.js复制。我知道连接器/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 "type"),这是X Plugin的限制。
插件修复的一种方法是将JSON_EXTRACT()
替换为JSON_VALUE()
,在这种情况下将返回适当的NULL
值,但我不知道这意味着什么。
作为变通方法,您总是可以使用
session.sql("select doc from `<some_schema>`.`users` where json_value(doc, '$.age') is null").execute()
同时,我鼓励您在https://bugs.mysql.com/上使用MySQL Server: Document Store: X Plugin
或MySQL Server: Document Store: MySQL Shell
类别报告错误。
免责声明:我是MySQL X DevAPI Connector for Node.js的首席开发者