如何查询 Mysql X DevAPI 中的空字段或缺失字段?

How to query for Null or Missing Fields in Mysql X DevAPI?

如何在 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 重现它。我知道 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 是 returning null(JSON 类型)而不是 NULL(SQL“类型” ), 这是 X 插件的限制。

插件修复此问题的一种方法是将 JSON_EXTRACT() 替换为 JSON_VALUE(),在这种情况下,这将 return 正确的 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

的首席开发人员