如何在 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 PluginMySQL 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 搜索嵌套数组

X DevAPI mysqlx::Session() over linux socket 失败并显示“CDK 错误:意外消息”

使用SpringBoot和X DevApi构建真异步的API