如何查询Null或缺失字段在Mysql X DevAPI?



如何查询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 PluginMySQL Server: Document Store: MySQL Shell类别报告错误。

免责声明:我是MySQL X DevAPI Connector for Node.js的首席开发者

相关内容

  • 没有找到相关文章

最新更新