如何在 Mysql X DevAPI 中查询 Null 或 Missing 字段?
Posted
技术标签:
【中文标题】如何在 Mysql X DevAPI 中查询 Null 或 Missing 字段?【英文标题】:How to query for Null or Missing Fields in Mysql X DevAPI? 【发布时间】:2021-02-24 07:00:36 【问题描述】:如何在 mysql X DevAPI 中查询 null 或缺失的字段?
我尝试了.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)
【问题讨论】:
【参考方案1】:我可以使用 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 的首席开发人员
【讨论】:
以上是关于如何在 Mysql X DevAPI 中查询 Null 或 Missing 字段?的主要内容,如果未能解决你的问题,请参考以下文章
如何设置 MySQL 连接器/Python X DevAPI 连接的选项?
您如何为 MySQL X DevAPI 使用 Java 连接池?
PHP MySQL X DevAPI Collection::existsInDatabase() 方法无法识别带有附加列的集合
X DevAPI mysqlx::Session() over linux socket 失败并显示“CDK 错误:意外消息”